WEB开发网
开发学院软件开发Python 可爱的 Python: Python 之优雅与瑕疵,第 2 部分 阅读

可爱的 Python: Python 之优雅与瑕疵,第 2 部分

 2008-09-30 12:58:25 来源:WEB开发网   
核心提示: 一种老式方法在过去(Python 2.1 以前),Python 具有一个神奇的方法,可爱的 Python: Python 之优雅与瑕疵,第 2 部分(2),称为 .__getattr__(),类可以定义该方法以返回经过计算的值,没什么特别明显的不同,事实上,而不仅仅是简单的数据访问,同样神

一种老式方法

在过去(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

上一页  1 2 3 4 5 6 7  下一页

Tags:可爱 Python Python

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接