鱼C论坛

 找回密码
 立即注册
查看: 963|回复: 3

[已解决]类中属性访问

[复制链接]
发表于 2021-7-27 09:34:18 | 显示全部楼层 |阅读模式

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

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

x
魔法方法__getattribute__和__get__之间有啥联系和区别
如果run以下代码
class A:
    def __get__(self,instance,owner):
        print('正在进行get操作')
        
class B:
    x = A()
    def __getattribute__(self,name):
        print('正在进行getattribute操作')

a = B()
a.x
结果是:正在进行getattribute操作
如果run这个代码
class A:
    def __get__(self,instance,owner):
        print('正在进行get操作')
        
class B:
    x = A()
结果就是:正在进行get操作
????
最佳答案
2021-7-27 15:05:17
__get__, __set__, __del__, __set_name__ 这四个是一类的,用在"描述器"时,通常前两个用的更多。
而描述器的具体写法,可以参考官方文档和Python的Howto系列文章。

__getattribute__ 是一个很底层的,实例对象的"属性查找机制"。(注:这里的属性,包括一般对象的值属性和对象的方法。)
那么,什么是"属性的查找机制"呢? —— 其实就是,当 一个对象实例名(如叫 'obj')开始 '.' ( 点出某个属性)时就会触发 __getattribute__()  
注1:通常是object总类里的__getattribute__,因为继承机制。
注2:通过类名'.'出 类变量时,不会触发
       只有通过 实例名'.'出时,才会触发。  而这是绝大数的情况,故说"很底层"。。

又因为每个类都继承了object这一总类,若 你在自定义类中 重写了 __getattribute__ ,
那 它可能无法获取到正确的属性,所以 通常都要 return object.__getattribute__(self, attr)


参考:https://blog.csdn.net/qq_26442553/article/details/82467777
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattribute.html


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

使用道具 举报

发表于 2021-7-27 11:07:27 | 显示全部楼层
__getattribute__比__get__优先级高
如果__getattribute__没return才去运行__get__

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

使用道具 举报

发表于 2021-7-27 11:08:05 | 显示全部楼层
我的理解是
类A和类B 都有这个两个__get__和__getattribute__
但你分别对A的__get__和B的 __getattribute__重新定义
像第一个a.x,触发B类的__getattribute__方法
第二个也会触发 B类的__getattribute__方法,不过是没有修改过的
可能原来的__getattribute__就会调用了其他方法去调用类A的__get__方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-27 15:05:17 | 显示全部楼层    本楼为最佳答案   
__get__, __set__, __del__, __set_name__ 这四个是一类的,用在"描述器"时,通常前两个用的更多。
而描述器的具体写法,可以参考官方文档和Python的Howto系列文章。

__getattribute__ 是一个很底层的,实例对象的"属性查找机制"。(注:这里的属性,包括一般对象的值属性和对象的方法。)
那么,什么是"属性的查找机制"呢? —— 其实就是,当 一个对象实例名(如叫 'obj')开始 '.' ( 点出某个属性)时就会触发 __getattribute__()  
注1:通常是object总类里的__getattribute__,因为继承机制。
注2:通过类名'.'出 类变量时,不会触发
       只有通过 实例名'.'出时,才会触发。  而这是绝大数的情况,故说"很底层"。。

又因为每个类都继承了object这一总类,若 你在自定义类中 重写了 __getattribute__ ,
那 它可能无法获取到正确的属性,所以 通常都要 return object.__getattribute__(self, attr)


参考:https://blog.csdn.net/qq_26442553/article/details/82467777
https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattribute.html


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 17:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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