首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内置对象的属性赋值

内置对象的属性赋值
EN

Stack Overflow用户
提问于 2011-04-21 16:47:12
回答 4查看 3K关注 0票数 10

这是可行的:

代码语言:javascript
复制
class MyClass(object):
    pass

someinstance = MyClass()
someinstance.myattribute = 42
print someinstance.myattribute
>>> 42

但这不是:

代码语言:javascript
复制
someinstance = object()
someinstance.myattribute = 42
>>> AttributeError: 'object' object has no attribute 'myattribute'

为什么?我有一种感觉,这与object是一个内置类有关,但我发现这并不令人满意,因为我在MyClass的声明中没有做任何更改。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-21 17:10:32

Python将属性存储在字典中。您可以将属性添加到MyClass,请参阅它有一个__dict__

代码语言:javascript
复制
>>> 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__属性。

代码语言:javascript
复制
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

更详细的解释:

票数 8
EN

Stack Overflow用户

发布于 2014-03-01 03:15:53

至于这背后的理由,the BDFL himself的话

这是故意禁止的,以防止对内置类型的意外致命更改(对于您从未想过的代码部分是致命的)。此外,这样做是为了防止更改影响驻留在地址空间中的不同解释器,因为内置类型(与用户定义的类不同)在所有此类解释器之间共享。

票数 9
EN

Stack Overflow用户

发布于 2011-04-21 17:08:09

代码语言:javascript
复制
>>> type(object)
type 'type'
>>> type(MyClass)
type 'classobj'

这里最重要的区别是MyClass是一个用户定义的类对象。在这里你可以修改你的类。

但是,object()是一个__builtin__类对象。

当您从作为基类的object以及__builtin__继承时,您只能修改您定义的新MyClass

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5741699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档