在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__
关于Python 语言问题 : attributes of object() vs Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1072649/