4

为什么这会引发错误:

o = object()
o.i = 1

但这不会:

class A(object):
    pass

a = A()
a.i = 1

?

4

2 回答 2

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 中定义类型。

于 2012-04-30T16:38:48.223 回答
2

object是在 C 中定义的。除非您在类型定义中填充适当的槽,否则您不能将任意属性添加到 C 中定义的类型的实例。

于 2012-04-30T16:37:41.187 回答