python属性访问顺序_Python属性的查找顺序

属性查找顺序

关于属性描述符请看上文>属性描述符

在梳理属性查找相关知识时,查看了很多的书籍和他人的博客,发现很多讲的过于抽象,并没有一个清晰的流程呈现。特此写下我对于此方面的理解和总结。

我将属性的查找拆分为三种情形,分别为普通属性查找、数据描述符查找,非数据描述符查找。

普通属性的查找

Normal.py

class MyAttr():

name = 'class_levy'

def __init__(self):

self.name = "instance_levy"

def __getattribute__(self, item):

return "This is getattribute"

def __getattr__(self, item):

return "This is getattr"

my = MyAttr()

print(my.name)

我通过上述的代码,一步步的调试,将步骤呈现给读者。当前的输出结果是“This is getattribute"

将当前代码中如下的片段注释后,输出结果为"instance_levy"

#def __getattribute__(self, item):

#return "This is getattribute"

接下来将__init(self)重写如下,输出内容为"class_levy"

def __init__(self):

pass

最后将类属性注释,输出内容为"This is getattr"

从上述的流程,我们可以分析出普通属性的查找过程为__getattribute__()->实例属性->类属性->getattr

数据描述符的查找

DataDes.py

class Data():

def __get__(self, instance, owner):

return "This is get"

def __set__(self, instance, value):

pass

class MyAttr():

name = Data()

def __init__(self):

self.name = "instance_levy"

def __getattribute__(self, item):

return "This is getattribute"

def __getattr__(self, item):

return "This is getattr"

my = MyAttr()

print(my.name)

同上所述的分析方法,我们可以得出查找顺序__getattribute__()->描述符__get__()->实例属性->getattr

非数据描述符的查找

NotdataDes.py

class NoneData():

def __get__(self, instance, owner):

return "This is get"

class MyAttr():

name = NoneData()

def __init__(self):

self.name = "instance_levy"

def __getattribute__(self, item):

return "This is getattribute"

def __getattr__(self, item):

return "This is getattr"

my = MyAttr()

print(my.name)

同上所述的分析方法,我们可以得出查找顺序__getattribute__()->实例属性->描述符__get__()->getattr

流程图

以下为三种情况下的流程图,为了理解更容易我将三种情况分别讲述,在大部分的流程讲解中是不为三种情况分别叙述的,容易造成复杂混乱的感觉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值