Ant*_*ong 17 python function object
在python中,为这样的对象实例创建新属性是非法的
>>> a = object()
>>> a.hhh = 1
Run Code Online (Sandbox Code Playgroud)
投
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hhh'
Run Code Online (Sandbox Code Playgroud)
但是,对于一个函数对象,它是可以的.
>>> def f():
... return 1
...
>>> f.hhh = 1
Run Code Online (Sandbox Code Playgroud)
这种差异背后的理由是什么?
Ale*_*lli 22
函数对象支持任意属性的原因是,在我们添加该特性之前,几个框架(例如解析器生成器)滥用函数文档字符串(以及函数对象的其他属性)来隐藏对它们至关重要的每个函数信息 - 需要将任意命名属性关联到函数对象,这些函数对象通过示例得到证明,直接用语言支持它们而不是踢出并让(例如)文档字符串被滥用,这是非常明显的.
为了支持任意实例的属性类型必须提供一个它的实例中的每一个__dict__
-这不是什么大不了的功能(这是从来没有微小物体反正),但它很可能是为其他对象预期是微小的.通过使object
类型尽可能轻,并提供__slots__
允许避免__dict__
子类型中的每个实例object
,我们尽最大努力支持小的,专门的"价值"类型.
Alex Martelli发表了一个很棒的答案.对于正在寻找在空对象上完成任意属性的好方法的任何人,请执行以下操作:
class myobject(object):
pass
o = myobject()
o.anything = 123
Run Code Online (Sandbox Code Playgroud)
如果你知道属性,或者更有效(并且更好地记录):
class myobject(object):
__slots__ = ('anything', 'anythingelse')
o = myobject()
o.anything = 123
o.anythingelse = 456
Run Code Online (Sandbox Code Playgroud)