使用Descriptor类进行python Descriptor的内部工作

时间:2019-02-15 09:33:03

标签: python-3.x

我无法理解_onRecentEntryAdded(Event event) { setState(() { recentMatchList.add(MatchDataModel.fromSnapshot(event.snapshot)); FirebaseDatabase.instance .reference() .child('match') .child(event.snapshot.key) .once() .then((DataSnapshot snap) { recentMatchList.add(MatchDataModel.fromSnapshot(snap)); }); }); } 行的工作方式。 乍一看,我们有三个变量,即name(instance variable), age(实例变量)和age(class变量))。类变量age被初始化为AgeDiscriptori,即age = AgeDescriptor()。在设置年龄时,该代码如何在内部工作以及如何调用age = AgeDescriptor()__set__的discriptor方法。如何在内部执行此绑定。

__get__

1 个答案:

答案 0 :(得分:0)

摘自M. Summerfield的“用Python 3编程:完整介绍”(第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__(...)