对内置对象进行属性赋值

10 投票
4 回答
3770 浏览
提问于 2025-04-16 16:09

这个是可以正常工作的:

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'

为什么呢?我觉得这可能和对象是一个内置类有关,但我觉得这样解释不太令人满意,因为我在MyClass的声明上没有做任何改变。

4 个回答

1
>>> type(object)
type 'type'
>>> type(MyClass)
type 'classobj'

这里重要的区别是,MyClass 是一个用户自定义的类对象。也就是说,你可以对这个类进行修改。

object() 则是一个内置的类对象。

当你从这个对象继承,也就是把它作为你的基类时,你只能修改你自己定义的新 MyClass

9

关于这个问题的原因,BDFL本人是这么说的:

这样做是为了防止意外地对内置类型进行致命的修改(这些修改可能会影响到你从未考虑过的代码部分)。此外,这样做也是为了避免这些修改影响到在同一地址空间中运行的不同解释器,因为内置类型(与用户自定义的类不同)是所有这些解释器共享的。

8

在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__']

更详细的解释:

撰写回答