我无法理解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__(...)
。