描述器在对象“."时即产生作用
1、类定义中既有__get__()由有__set__()函数时,返回__get__()函数的返回值
class D:
def __get__(self, obj, objtype):
return 'peter'
class A:
d = D()
o = A()
o.d = 'bob'
D.__set__ = lambda x, y, z: None
o.d # peter
2、如果类定义中不同时存在__get__()和__set__(),返回对象的__dict__中的属性值
class D:
def __get__(self, obj, objtype):
return 'peter'
class A:
def __init__(self) -> None:
self.d = 'bob'
o = A()
o.d # bob
3、如果类定义中存在__get__(),对象字典中__dict__不存在所取的属性,则返回__get__()函数的返回值
class D:
def __get__(self, obj, objtype):
return 'peter'
class A:
d = D()
o = A()
o.d # peter
4、如果类定义中不存在__get__(),对象字典中__dict__不存在所取的属性,则在类的__dict__中找所取属性
class D:
d = 'Alice'
class A(D):
pass
o = A()
o.d # Alice
4、class self的魔法
4.1、定义类的时候,A.dict__里面产生了f这个function,调用A.f的时候,由于A中不同时定义__get__和__set,通过__dict__返回f这个function。
4.2、调用o.f的时候,由于o不是描述器且__dict__中不存在f这个属性,从A的__dict__中去拿f,由于f是一个描述器,f的描述器返回绑定了o这个对象的method。
class A:
def f(self, data):
print(self.name)
print(data)
o = A()
o.name = 'Bob'
A.f # <function __main__.A.f(self, data)>
o.f # <bound method A.f of <__main__.A object at 0x7ea9e6e03350>>
例1、
class FuncDescr:
def __get__(self, *args):
def f(self, data):
print(self.name)
print(data)
return f
class A:
f = FuncDescr()
o = A()
o.name = 'bob'
o.f(o, 'hello')