监控对象中所有的属性
尽管使用property函数可以将三个方法与一个属性绑定,在读写属性值和删除属性时会调用相应的方法进行处理,但是,如果需要监控的属性很多,则这样做就以为着在类中需要定义大量的getter和setter方法。所以说,property函数只是解决了外部调用这些属性的问题,并没有解决内部问题。本节介绍三个特殊成员方法__getattr__
、__setattr__
和__delattr__
,当任何一个属性进行读写和删除操作时,都会调用它们中的一个方法进行处理。
__getattr__(self,name)
:用于监控所有属性的读操作,其中name表示监控的属性名。__setattr__(self,name,value)
:用于监控所有属性的写操作,其中name表示监控的属性名,value表示设置的属性值__delattr__(self,name)
:用于监控所有属性的删除操作,其中name表示监控的属性名。
[例 10.8] 本例重新改写了10.3.2节的Rectangle类,在Rectangle类的构造方法中为Rectangle类添加了4个属性(width、height、left和top),并定义了__setattr__
、__getattr__
和__delattr__
方法,分别用于监控这4个属性值的读写操作以及删除操作。在这三个特殊成员方法中访问了size和position属性。读写和删除size属性实际上操作的是width和height属性,读写和删除position属性实际上操作的是left和top属性。
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
self.left = 0
self.top = 0