在Python中,当你访问对象的一个属性(也就是写出类似obj.xxx的代码时),访问的优先级从高到低如下所示:
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__函数
非覆盖型描述符又称为数据描述符,也就是定义了__get__但没有定义__set__的描述符。
描述符的具体语法可以参见这篇文章:https://www.cnblogs.com/wickedpriest/p/11913593.html
需要注意的是,当用户自己定义了__getattribute__时,对数据描述符的访问可能会被忽略。
这几个比较简单,不再赘述
注意是父类的属性,而不是父类对象的属性。父类中定义的属性也是子类的属性
怎么找都找不到该属性了,才会调用__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
原文:https://www.cnblogs.com/wickedpriest/p/11984887.html