这是可行的:
class MyClass(object):
pass
someinstance = MyClass()
someinstance.myattribute = 42
print someinstance.myattribute
>>> 42但这不是:
someinstance = object()
someinstance.myattribute = 42
>>> AttributeError: 'object' object has no attribute 'myattribute'为什么?我有一种感觉,这与object是一个内置类有关,但我发现这并不令人满意,因为我在MyClass的声明中没有做任何更改。
发布于 2011-04-21 17:10:32
Python将属性存储在字典中。您可以将属性添加到MyClass,请参阅它有一个__dict__
>>> class MyClass(object):
>>> pass
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']重要的区别在于object没有__dict__属性。
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']更详细的解释:
发布于 2014-03-01 03:15:53
至于这背后的理由,the BDFL himself的话
这是故意禁止的,以防止对内置类型的意外致命更改(对于您从未想过的代码部分是致命的)。此外,这样做是为了防止更改影响驻留在地址空间中的不同解释器,因为内置类型(与用户定义的类不同)在所有此类解释器之间共享。
发布于 2011-04-21 17:08:09
>>> type(object)
type 'type'
>>> type(MyClass)
type 'classobj'这里最重要的区别是MyClass是一个用户定义的类对象。在这里你可以修改你的类。
但是,object()是一个__builtin__类对象。
当您从作为基类的object以及__builtin__继承时,您只能修改您定义的新MyClass。
https://stackoverflow.com/questions/5741699
复制相似问题