[英]Python Language Question: attributes of object() vs Function
在python中,为这样的对象实例创建新属性是非法的
>>> a = object()
>>> a.hhh = 1
投
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hhh'
但是,对于一个函数对象,它是可以的。
>>> def f():
... return 1
...
>>> f.hhh = 1
这种差异背后的理由是什么?
函数对象支持任意属性的原因是,在我们添加该特性之前,几个框架(例如解析器生成器)滥用函数文档字符串(以及函数对象的其他属性)来隐藏对它们至关重要的每个函数信息 - 需要将任意命名属性关联到函数对象,这些函数对象通过示例得到证明,直接用语言支持它们而不是踢出并让(例如)文档字符串被滥用,这是非常明显的。
为了支持任意实例的属性类型必须提供其实例的每一个有__dict__
-这不是什么大不了的功能(这是从来没有微小物体反正),但它很可能是意在微小的其他对象。 通过使object
类型尽可能轻,并提供__slots__
以允许在object
子类型中避免每个实例__dict__
,我们尽最大努力支持小的,专门的“值”类型。
Alex Martelli发表了一个很棒的答案。 对于正在寻找在空对象上完成任意属性的好方法的任何人,请执行以下操作:
class myobject(object):
pass
o = myobject()
o.anything = 123
如果你知道属性,或者更有效(并且更好地记录):
class myobject(object):
__slots__ = ('anything', 'anythingelse')
o = myobject()
o.anything = 123
o.anythingelse = 456
理由是object()
一个实例是一个退化的特例。 它“是”一个对象,但它本身并不是有用的。
将object
视为临时hack,桥接旧式类型和类。 在Python 3.0中,它将逐渐消失,因为它将不再被用作一部分
class Foo( object ):
pass
f = Foo()
f.randomAttribute = 3.1415926
这是另一种替代方案,尽可能简短:
>>> dummy = type('', (), {})()
>>> dummy.foo = 5
>>> dummy.foo
5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.