可爱的 Python: Python 之优雅与瑕疵,第 2 部分
2008-09-30 12:58:25 来源:WEB开发网一种老式方法
在过去(Python 2.1 以前),Python 具有一个神奇的方法,称为 .__getattr__(),类可以定义该方法以返回经过计算的值,而不仅仅是简单的数据访问。同样神奇的 .__setattr__() 和 .__delattr__() 方法可以在设置或删除 “属性” 时使代码运行。这种旧式机制的问题是,您从来没有真正了解代码是否确实将被调用,因为这取决于属性是否具有与 obj.__dict__ 中访问过的属性相同的名称。您可以尝试创建控制 obj.__dict__ 最终状态的 .__setattr__() 和 .__delattr__() 方法,但即使这样也不能防止其他代码对 obj.__dict__ 的直接操作。不管在处理对象时是否实际运行了方法,修改继承树和将对象传递给外部函数经常会使这一点变得不那么明显。例如:
清单 1. 是否将运行方法?
>>> class Foo(object):
... def __getattr__(self, name):
... return "Value of %s" % name
>>> foo = Foo()
>>> foo.just_this = "Some value"
>>> foo.just_this
'Some value'
>>> foo.something_else
'Value of something_else'
对 foo.just_this 的访问跳过了方法代码,而对 foo.something_else 的访问则运行了代码;除了这个 shell 会话较短以外,没什么特别明显的不同。事实上,是否运行了 hasattr(),答案很让人容易误解:
清单 2. hasattr() 使用的多义性
>>> hasattr(foo,'never_mentioned')
True
>>> foo2.__dict__.has_key('never_mentioned') # this works
False
>>> foo2.__dict__.has_key('just_this')
True
更多精彩
赞助商链接