为什么会引发错误:
o = object()
o.i = 1
但这不是:
class A(object):
pass
a = A()
a.i = 1
答案 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中定义的类型的实例。