为什么可以将属性添加到对象的子类的实例,而不是对象的实例?

时间:2012-04-30 16:34:19

标签: python object attributes

为什么会引发错误:

o = object()
o.i = 1

但这不是:

class A(object):
    pass

a = A()
a.i = 1

2 个答案:

答案 0 :(得分:9)

因为内置类型没有与它们相关联的词典来保存添加的属性:

>>> o = object()
>>> dir(o)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

请参阅?否__dict__

但是添加一个子类会将属性放在某个地方:

>>> class A(object):
....    pass
....
>>> a = A()
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

说它是“因为它们是用C语言定义的”并不是“为什么”。您当然可以使用实例字典在C中定义类型。

答案 1 :(得分:2)

object在C中定义。您不能将任意属性添加到C unless you fill the appropriate slots in the type definition中定义的类型的实例。