使用描述符类的python描述符的内部工作



我无法理解age = AgeDescriptor()行是如何工作的。 乍一看,我们似乎有三个变量,名称(实例变量), 年龄(实例变量)和年龄(类变量))。类变量年龄初始化为AgeDiscriptori,即age = AgeDescriptor()。这段代码如何在内部工作,以及当我们设置和获取年龄时如何调用__set____get__的 discriptor 方法。如何在内部执行此绑定。

class AgeDescriptor:
def __init__(self):
self._age = 0
def __set__(self, instance, value):
print('setter')
self._age = value
def __get__(self, instance, owner):
print('getter')
return self._age

class Person:
age = AgeDescriptor()
def __init__(self, name, age):
self.name = name
self.age = age
def get_age(self):
return self.age
def set_age(self, value):
self.age = value

if __name__ == "__main__":
e1 = Person("ankit", 29)

摘自M. Summerfield的"Programming in Python 3: A Complete Introduction"(第8章):

描述符是为其他类的属性提供访问控制的类。任何实现一个或多个描述符特殊方法(__get__()__set__()__delete__())的类都称为(并且可以用作)描述符。

内置的property()classmethod()函数是使用描述符实现的。理解描述符的关键是,尽管我们在类中创建描述符的实例作为类属性,但 Python 通过类的实例访问描述符。

因此,当您访问age属性(如e1.age(或self.age))时,发生的情况Person.age.__get__(...)因为Python发现Person类具有名为age的描述符,因此使用该描述符来获取属性的值。同样,当您想更改age属性(如e1.age = 100(或self.age = 100))时,发生的情况是Person.age.__set__(...)

最新更新