设为首页
收藏本站
切换到宽版
登录
注册
找回密码
搜索
搜索
本版
文章
帖子
用户
快捷导航
易学开发平台
易学在线课堂
易学智能论坛
BBS
易学智能
»
易学智能论坛
›
技术大讨论
›
Python开发
›
AttributeError: 'object' object has no attribute 'at ...
返回列表
查看:
1930
|
回复:
3
AttributeError: 'object' object has no attribute 'attr'
[复制链接]
他改变了中国
他改变了中国
当前离线
积分
83
3
主题
31
帖子
83
积分
注册会员
注册会员, 积分 83, 距离下一级还需 117 积分
注册会员, 积分 83, 距离下一级还需 117 积分
积分
83
发消息
发表于 2018-9-19 15:12:12
|
显示全部楼层
|
阅读模式
本帖最后由 他改变了中国 于 2018-9-19 15:18 编辑
我发现这是无效的:
<font size="2"><font size="4">o = object()
o.attr = 'hello'</font></font>
复制代码
由于AttributeError: 'object' object has no attribute 'attr'。但是,对于从object继承的任何类,它是有效的:
<font size="2"><font size="4">class Sub(object):
pass
s = Sub()
s.attr = 'hello'</font></font>
复制代码
打印s.attr按预期显示“你好”。为什么会这样?
回复
使用道具
举报
上条把妹之手
上条把妹之手
当前离线
积分
108
5
主题
41
帖子
108
积分
注册会员
注册会员, 积分 108, 距离下一级还需 92 积分
注册会员, 积分 108, 距离下一级还需 92 积分
积分
108
发消息
发表于 2018-9-19 15:15:23
|
显示全部楼层
本帖最后由 上条把妹之手 于 2018-9-19 15:19 编辑
为了支持任意属性赋值,对象需要__dict__:与对象关联的dict,其中可以存储任意属性。否则,无处可放新属性。
实例object并没有随身携带__dict__-如果它这样做了,会导致可怕的循环依赖问题(因为之前dict,像其他所有的事情,从继承object;-),这将使得每一个在Python对象有一个字典,这将意味着开销当前没有或不需要dict的每个对象的许多字节数(实质上,所有没有任意可分配属性的对象都没有或不需要dict)。
回复
使用道具
举报
令狐少侠
令狐少侠
当前离线
积分
180
10
主题
72
帖子
180
积分
注册会员
注册会员, 积分 180, 距离下一级还需 20 积分
注册会员, 积分 180, 距离下一级还需 20 积分
积分
180
发消息
发表于 2018-9-19 15:16:49
|
显示全部楼层
正如二楼所说,一个object没有__dict__。object是所有类型的基类,包括int或str。因此,提供的任何东西也object将成为他们的负担。即使像可选的 那样简单,__dict__也需要为每个值添加额外的指针; 对于非常有限的实用程序,这会浪费系统中每个对象的额外4-8个字节的内存。
回复
使用道具
举报
此间少年
此间少年
当前离线
积分
88
4
主题
33
帖子
88
积分
注册会员
注册会员, 积分 88, 距离下一级还需 112 积分
注册会员, 积分 88, 距离下一级还需 112 积分
积分
88
发消息
发表于 2018-9-19 15:17:54
|
显示全部楼层
这只是因为优化。
Dicts相对较大。
>>> import sys
>>> sys.getsizeof((lambda:1).__dict__)
140
在C中定义的大多数(可能是所有)类都没有用于优化的字典。
如果查看源代码,你将看到有很多检查以查看对象是否有dict。
回复
使用道具
举报
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表