鱼C论坛

 找回密码
 立即注册
查看: 3528|回复: 7

关于__dict__

[复制链接]
发表于 2022-7-15 18:19:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
屏幕截图 2022-07-15 181540.png
我想问的是,为什么我在类中定义的变量无法用__dict__读取出,反而赋值了后才可以输出呢?
(抱歉用词不专业,讲的可能有些晦涩,但还是希望有大佬可以帮忙解答)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-15 18:37:10 | 显示全部楼层
class A:
    x = 100
    y = 200
    def a(self):
        pass

A.__dict__ #直接通过类对象 (A) 才能获取,因为它是只在类对象 A 中定义的,除非你写 self.x = 100 才能这样访问
mappingproxy({'__module__': '__main__', 'x': 100, 'y': 200, 'a': <function A.a at 0x03419C40>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
a = A() #间接通过实例对象无法访问,需要在定义时变量名前加上 "self." !
a.__dict__
{}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-15 18:37:10 | 显示全部楼层
本帖最后由 jackz007 于 2022-7-15 18:38 编辑

     x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中,用 A . __dict__ 看看。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-15 18:54:28 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-15 18:55:01 | 显示全部楼层
jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...

噢噢噢噢,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-15 18:56:51 | 显示全部楼层
jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...

不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-15 20:06:13 | 显示全部楼层
1872191836 发表于 2022-7-15 18:56
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑

只有用 self.变量名 这种名名方式才能让其类对象的实例对象也用有次变量,比如在:
class a:
    self.num = 100 #这里 self 就相当于以后的实例对象,所以就相当于后面实例对象拥有的变量。而去掉 self. 后就只能通过类对象访问了,因为他只会在类对象中创建一次,并不会在实例对象中也次次创建!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-15 20:08:44 | 显示全部楼层
1872191836 发表于 2022-7-15 18:56
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑

       对于 a 而言,类属性是只读的,就是说,虽然可以通过 a . x、a . y 访问到类属性,但是,却不可以通过类实例修改类属性,如果为 a . x、a . y 赋值,那么,将会为对象 a 创建新的实例属性 a . x、a . y,要想修改类属性,必须通过为 A . x、A . y 赋值来实现。
       当以 a . x 访问对象属性时,将优先考虑实例属性 a . x,如果实例属性不存在,才会考虑类的同名属性 A . x,如果都不存在,就会报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 13:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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