爲什麼這引發錯誤:爲什麼可以將屬性添加到對象的子類的實例,而不是添加到對象的實例?
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 unless you fill the appropriate slots in the type definition中定義的類型的實例。
這意味着你不能用C實例字典定義一個類型,並且不用C編寫的實現不會有這個限制。這兩個都不是真的。 「你不能」也不是「爲什麼你不能」的答案。 – agf