查看: 1930|回复: 3

AttributeError: 'object' object has no attribute 'attr'

[复制链接]

3

主题

31

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2018-9-19 15:12:12 | 显示全部楼层 |阅读模式
本帖最后由 他改变了中国 于 2018-9-19 15:18 编辑

我发现这是无效的:
  1. <font size="2"><font size="4">o = object()
  2. o.attr = 'hello'</font></font>
复制代码

由于AttributeError: 'object' object has no attribute 'attr'。但是,对于从object继承的任何类,它是有效的:
  1. <font size="2"><font size="4">class Sub(object):
  2.     pass
  3. s = Sub()
  4. s.attr = 'hello'</font></font>
复制代码

打印s.attr按预期显示“你好”。为什么会这样?

回复

使用道具 举报

5

主题

41

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-9-19 15:15:23 | 显示全部楼层
本帖最后由 上条把妹之手 于 2018-9-19 15:19 编辑

为了支持任意属性赋值,对象需要__dict__:与对象关联的dict,其中可以存储任意属性。否则,无处可放新属性。
实例object并没有随身携带__dict__-如果它这样做了,会导致可怕的循环依赖问题(因为之前dict,像其他所有的事情,从继承object;-),这将使得每一个在Python对象有一个字典,这将意味着开销当前没有或不需要dict的每个对象的许多字节数(实质上,所有没有任意可分配属性的对象都没有或不需要dict)。

回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-19 15:16:49 | 显示全部楼层
正如二楼所说,一个object没有__dict__。object是所有类型的基类,包括int或str。因此,提供的任何东西也object将成为他们的负担。即使像可选的 那样简单,__dict__也需要为每个值添加额外的指针; 对于非常有限的实用程序,这会浪费系统中每个对象的额外4-8个字节的内存。
回复

使用道具 举报

4

主题

33

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2018-9-19 15:17:54 | 显示全部楼层
这只是因为优化。
Dicts相对较大。
>>> import sys
>>> sys.getsizeof((lambda:1).__dict__)
140
在C中定义的大多数(可能是所有)类都没有用于优化的字典。
如果查看源代码,你将看到有很多检查以查看对象是否有dict。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表