自定义属性访问 [Python]
时间:2008-09-29 来源:lvDbing
方法 | 说明 |
__delattr__ | 客户删除一个属性时执行(例如 del anObject.attribute) |
__getattr__ | 客户访问一个属性名,但在对象__dict__属性中找不到这个名称时执行(例如anObject.unfoundName) |
__setattr__ | 客户将值指派给对象的属性时执行(例如anObject.attribute=value) |
#!/usr/bin/env python |
新的定义通过特殊方法__getattr__和__setattr__来控制客户访问及修改对象属性的方式。__init__为Time类默认的构造函数。构造函数只是将参数值指派给新对象的属性。如果类定义了特殊方法__setattr__,程序每次通过点运算符为对象的属性指派值时,Python都会调用这个方法。
这里__setattr__方法包含查错代码,用于确保对象数据处于一致性状态。方法要接收3个参数:对象引用(self)、要设置的属性名以及要指派给属性的值。首先检测要设置的属性是否名叫"hour",如果是,则判断指定的值是否在正确的范围内,如果值在正确的范围内,则访问对象的__dict__属性中恰当的键-值对,将值指派给属性_hour;否则,将引发一个异常,指出值是无效的。
非常重要的一点在于,__setattr__方法要用对象的__dict__属性来设置对象的属性。如果使用如下语句:
self._hour = value
那么__setattr__方法会再次执行,并使用参数"_hour"和value,从而导致无穷递归。相反,通过对象的__dict__属性来指派值,就不是调用__setattr__方法,而是将相应的键-值对插入对象的__dict__。
Print1
[root@lvdbing tmp]# python |
假如客户程序包含以下表达式:
time1.attribute
并将其作为一个"右值"(运算符右边的值),Python首先会在time1的__dict__属性中查找指定的属性名。如果找到这个名称,Python将返回属性的值。如果在对象的__dict__中没有找到属性名,Python会生成以下调用:
time1.__getattr__(attribute)
其中的attribute是客户试图访问的属性名。方法会检测客户是否试图访问hour,minute或者second。如果是,就返回相应属性的值。否则,方法会引用一个异常。