鱼C论坛

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

[已解决]魔法方法属性相关

[复制链接]
发表于 2020-6-16 11:21:04 | 显示全部楼层 |阅读模式

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

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

x
class C:
    def __getattribute__(self,name):
        print('getattribute')
        return super().__getattribute__(name)
    def __getattr__(self,name):
        print('getattr')
    def __setattr__(self,name,value):
        print('setattr')
        super().__setattr__(name,value)
    def __delattr__(self,name):
        print('delattr')
        super().__delattr__(name)
        
c=C()
为什么我的返回值是
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
getattribute
而且为什么getatrribute设置的返回值,但setattr和delattr只是继承却没有返回,getattr甚至没有继承?
最佳答案
2020-6-16 11:27:09
本帖最后由 Twilight6 于 2020-6-16 11:44 编辑


getatrribute设置的返回值,但setattr和delattr只是继承却没有返回?


你可以这样理解,知道各方法主要负责什么功能,粗略说下呗:

getatrribute 是因为外界获取属性时候自动调用,设置返回值后就会返回你要获取的属性,然后就直接可以打印出来

setattr 因为它是负责设置变量的属性,单纯的设置用的,并不需要你返回出值,因为设置属性并不需要你打印属性

delattr 也是同样的道理,它负责销毁属性用的,也不用设置返回值,因为删除属性并不要你打印删除的属性


getattr甚至没有继承?


super 应该不叫继承吧,叫调用父类方法吧

这里甲鱼哥只是为了让我们知道他们调用顺序的先后关系,但为什么前面的要继承呢?

那举个例子吧:

因为前面重写__getattribute__魔法方法,如果不重新调用父类,就失去了 __getattribute__ 原有的功能

而 __getattribute__ 原有的功能是什么?所有的属性访问是最先在 __getattribute__ 中查找,如果没有找到就会抛出AttributeError

而这个错误被 __getattr__ 接收,会调用 __getattr__ 这样有原有的 __getattribute__ 的功能 我们才能看到他们调用的关系

而你直接写不调用父类的方法,就会导致 新的 __getattribute__ 不会有这些功能,就无法做到测试调用顺序的作用了

所以只要你不影响原有的状态,就可以不用调用父类方法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-16 11:27:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-16 11:44 编辑


getatrribute设置的返回值,但setattr和delattr只是继承却没有返回?


你可以这样理解,知道各方法主要负责什么功能,粗略说下呗:

getatrribute 是因为外界获取属性时候自动调用,设置返回值后就会返回你要获取的属性,然后就直接可以打印出来

setattr 因为它是负责设置变量的属性,单纯的设置用的,并不需要你返回出值,因为设置属性并不需要你打印属性

delattr 也是同样的道理,它负责销毁属性用的,也不用设置返回值,因为删除属性并不要你打印删除的属性


getattr甚至没有继承?


super 应该不叫继承吧,叫调用父类方法吧

这里甲鱼哥只是为了让我们知道他们调用顺序的先后关系,但为什么前面的要继承呢?

那举个例子吧:

因为前面重写__getattribute__魔法方法,如果不重新调用父类,就失去了 __getattribute__ 原有的功能

而 __getattribute__ 原有的功能是什么?所有的属性访问是最先在 __getattribute__ 中查找,如果没有找到就会抛出AttributeError

而这个错误被 __getattr__ 接收,会调用 __getattr__ 这样有原有的 __getattribute__ 的功能 我们才能看到他们调用的关系

而你直接写不调用父类的方法,就会导致 新的 __getattribute__ 不会有这些功能,就无法做到测试调用顺序的作用了

所以只要你不影响原有的状态,就可以不用调用父类方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-16 12:02:12 | 显示全部楼层
Twilight6 发表于 2020-6-16 11:27
你可以这样理解,知道各方法主要负责什么功能,粗略说下呗:

getatrribute 是因为外界获取属性时 ...

好像是理解了 但是为什么我的运行结果是这样..
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-16 12:26:20 | 显示全部楼层
今天的我更强了 发表于 2020-6-16 12:02
好像是理解了 但是为什么我的运行结果是这样..

是不是 PyCharm  ? 反正不是 IDLE哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-16 12:32:30 | 显示全部楼层
Twilight6 发表于 2020-6-16 12:26
是不是 PyCharm  ? 反正不是 IDLE哈哈

我用anacoda里的python运行了..不是代码的问题吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-16 12:33:37 | 显示全部楼层
今天的我更强了 发表于 2020-6-16 12:32
我用anacoda里的python运行了..不是代码的问题吗?

不是代码问题,编译器环境不同,我PyCharm 也会这样 你单纯编辑好一次性运行就不会出现这个问题,如果运行脚本后才实例化什么的就会这样

没事 不影响正常功能
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-16 12:34:26 | 显示全部楼层
Twilight6 发表于 2020-6-16 12:33
不是代码问题,编译器环境不同,我PyCharm 也会这样 你单纯编辑好一次性运行就不会出现这个问题,如果运 ...

好的 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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