Python: 描述器 __get__(),__set__() 和 __delete__()
描述器的应用案例:Python内置的 property()
# 描述器练习 class RevealAccess(object): def __init__(self, val): self.val = val def __get__(self, obj, objtype=None): print('Retrieving', self.val) return self.val def __set__(self, obj, val): print('Updating', val) self.val = val class Test(object): def __init__(self, val, get=False): self.val = val if get: self.get() def get(self): return self.val class MyClass(object): r = RevealAccess(10) # RevealAccess是描述器,描述MyClass的属性r # 访问MyClass的属性r时,触发RevealAccess中__get__方法,获取并返回RevealAccess中的属性的值给r # 若对r赋值,则会触发RevealAccess中__set__方法,对RevealAccess中的属性赋值 t = Test(20) # Test是一个普通的类,属性t是一个Test的实例 tg = Test(20, True) # 无法从__init__返回值,所以tg仍然是一个Test的实例,而不是Test中的属性val r = RevealAccess(10) print(r.val) # 10 m = MyClass() print(a := m.r, type(a)) # Retrieving 10 \n 10 <class 'int'> m.r = 30 # Updating 30 print(m.r) # Retrieving 30 \n 30 print(b := m.t, type(b)) # <__main__.Test object at 0x7f4094dbfd00> <class '__main__.Test'> print(b.val) # 20 print(c := m.tg, type(c)) # <__main__.Test object at 0x7f4094dbfca0> <class '__main__.Test'> print(c.val) # 20