为什么这会引发错误:
o = object()
o.i = 1
但这不会:
class A(object):
pass
a = A()
a.i = 1
?
为什么这会引发错误:
o = object()
o.i = 1
但这不会:
class A(object):
pass
a = A()
a.i = 1
?
因为内置类型没有与之关联的字典来保存添加的属性:
>>> 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 中定义类型。
object
是在 C 中定义的。除非您在类型定义中填充适当的槽,否则您不能将任意属性添加到 C 中定义的类型的实例。