首页 > 编程语言 > 详细

Python属性的查询优先级

时间:2019-12-04 19:54:15      阅读:109      评论:0      收藏:0      [点我收藏+]

在Python中,当你访问对象的一个属性(也就是写出类似obj.xxx的代码时),访问的优先级从高到低如下所示:

1.__getattribute__
这是优先级最高的函数,所有对属性的访问必先访问它。举个例子:

class Obj(object):
    def __init__(self, weight, price):
        self.weight = weight
        self.price = price

    def __getattribute__(self, name):
        print name
        return 2
        

obj = Obj(1,2)
print obj.__getattribute__
print obj.weight

得到的输出为:

__getattribute__
2
weight
2

可以看到,哪怕是访问__getattribute__本身也要先经过__getattribute__函数

2.非覆盖型描述符

非覆盖型描述符又称为数据描述符,也就是定义了__get__但没有定义__set__的描述符。
描述符的具体语法可以参见这篇文章:https://www.cnblogs.com/wickedpriest/p/11913593.html
需要注意的是,当用户自己定义了__getattribute__时,对数据描述符的访问可能会被忽略。

3.实例属性、4.类属性、5.覆盖型描述符

这几个比较简单,不再赘述

6.父类的属性

注意是父类的属性,而不是父类对象的属性。父类中定义的属性也是子类的属性

7.__getattr__

怎么找都找不到该属性了,才会调用__getattr__来访问。
以下代码的注释中标明了访问顺序:

class A(object):
    val = 5 # 3
    def __init__(self):
        self.val = 1 # 1

class B(A):
    val = 10 # 2
    def __init__(self):
        super(B, self).__init__()
        self.val = 2 # 1
    
    def __getattr__(self, name): 
        if name == "val": # 4
            return 8
        return 0

Python属性的查询优先级

原文:https://www.cnblogs.com/wickedpriest/p/11984887.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!