【发布时间】:2016-05-05 01:37:43
【问题描述】:
我在阅读 Counter 类的 __init__ 方法时,看到了这个:
if not args:
TypeError("descriptor '__init__' of 'Counter' object "
"needs an argument")
我不确定descriptor是什么意思,所以我查了python数据模型文档,发现是这样的:
通常,描述符是具有“绑定行为”的对象属性,其属性访问已被描述符协议中的方法覆盖:__get__()、__set__() 和 __delete__()。如果为对象定义了这些方法中的任何一个,则称其为描述符。
类定义中似乎没有这些方法,那么为什么将 __init_ 称为描述符?
【问题讨论】:
-
为了记录,它具有这种设计的唯一原因是允许使用名为
self的关键字参数初始化Counter,而不会意外替换__init__中的self实例;他们必须接受位置可变参数并手动提取“真实”self,因此它没有可以被关键字参数覆盖的外部名称。除非您手动调用__init__,否则您实际上无法触发此错误(并且这样做时没有在子类中使用super,这会隐式传递它,就像常规构造一样)。
标签: python python-3.x python-datamodel