鱼C论坛

 找回密码
 立即注册
查看: 1806|回复: 6

[已解决]魔法方法属性访问,求指教

[复制链接]
发表于 2020-3-12 22:19:37 | 显示全部楼层 |阅读模式

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

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

x
代码1:不给属性赋值,则有输出结果,输出结果为:该属性不存在!
class Demo:
    def __getattr__(self, name):

        a='该属性不存在!'

        print(a)
        return a




demo = Demo()    #创建一个对象
#demo.x       #x为对象的一个属性
demo.x

代码2:给代码赋值,为什么没有输出结果
class Demo:
    def __getattr__(self, name):

        a='该属性不存在!'

        print(a)
        return a




demo = Demo()    #创建一个对象
#demo.x       #x为对象的一个属性
demo.x=222
最佳答案
2020-3-12 23:17:39
本帖最后由 suchocolate 于 2020-3-13 22:18 编辑

__getattr__:定义用户访问一个不存在的属性时的行为
1)代码1:demo.x没有这个属性,所以执行__getattr__,其中有一个print,所以会输出。
2)代码2:demo.x=222是给属性赋值,不是访问不存在的属性,所以不会触发,就不会调用其中的print。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-12 23:17:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2020-3-13 22:18 编辑

__getattr__:定义用户访问一个不存在的属性时的行为
1)代码1:demo.x没有这个属性,所以执行__getattr__,其中有一个print,所以会输出。
2)代码2:demo.x=222是给属性赋值,不是访问不存在的属性,所以不会触发,就不会调用其中的print。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 13:21:31 | 显示全部楼层
suchocolate 发表于 2020-3-12 23:17
__getattr__:定义用户访问一个不存在的属性时的行为
1)代码1:demo.x没有这个属性,所以执行__getattr__ ...

赋值属性和属性是两个不同的概念,所以当使用__getattr__的时候,赋值属性是不会被访问到的,是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 18:49:26 | 显示全部楼层
714536074 发表于 2020-3-13 13:21
赋值属性和属性是两个不同的概念,所以当使用__getattr__的时候,赋值属性是不会被访问到的,是吧?

只有当类中不存在这个属性的时候才会调用__getattr__,不知道啥是赋值属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-13 21:29:14 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-13 18:49
只有当类中不存在这个属性的时候才会调用__getattr__,不知道啥是赋值属性

我的意思是说,demo.x=222是给属性赋值吧,为什么给属性赋值了,就不会有输出结果,而不给属性赋值就有输出结果呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-13 22:17:06 | 显示全部楼层
714536074 发表于 2020-3-13 13:21
赋值属性和属性是两个不同的概念,所以当使用__getattr__的时候,赋值属性是不会被访问到的,是吧?

不好意思,没写清楚。
是的demo.x=222是给属性赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 12:16:51 | 显示全部楼层
714536074 发表于 2020-3-13 21:29
我的意思是说,demo.x=222是给属性赋值吧,为什么给属性赋值了,就不会有输出结果,而不给属性赋值就有输 ...

对于一个不存在的属性才会调用__getattr__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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