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

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

 2008-09-30 12:58:25 来源:WEB开发网   
核心提示: .__getattribute__() 方法在 Python 2.2 及之后版本中,您可以选择使用 .__getattribute__() 方法,可爱的 Python: Python 之优雅与瑕疵,第 2 部分(4),代替具有类似名称且易被混淆的老式 .__getattr__() 方法,如

.__getattribute__() 方法

在 Python 2.2 及之后版本中,您可以选择使用 .__getattribute__() 方法,代替具有类似名称且易被混淆的老式 .__getattr__() 方法。如果使用的是新式的类(一般情况下总是如此),您就可以这样做。.__getattribute__() 方法比它的同类方法更为强大,因为不管属性是不是在 obj.__dict__ 或 obj.__slots__ 中定义的,它将拦截所有 属性访问。使用 .__getattribute__() 方法的一个缺点是,所有访问都需通过该方法。如果您使用这种方法,并希望返回(或操作)属性的 “real” 值,则需要进行少量特殊的编程:通常可通过对超类(一般为 object)调用 .__getattribute__() 实现。例如:

清单 5. 返回一个 “real” .__getattribute__ value

>>> class Foo4(object):
...   def __getattribute__(self, name):
...     try:
...       return object.__getattribute__(self, name)
...     except:
...       return "Value of %s" % name
...
>>> foo4 = Foo4()
>>> foo4.x = 'x'
>>> foo4.x
'x'
>>> foo4.y
'Value of y'

在 Python 的所有版本中,.__setattr__() 和 .__delattr__() 还拦截了所有对属性的写入和删除访问,而不仅仅是 obj.__dict__ 缺少的那些访问。

描述符

通过枚举的方式,我们逐一介绍了如何使属性的行为类似于方法。通过使用这些方法,您可以检查被访问、赋值或删除的特定属性名。事实上,如果愿意的话,可以通过正则表达式或其他计算检查这些属性名。理论上讲,您可以制定任何类型的运行时决策,确定如何处理某些给定的伪属性。例如,假设您并不想对属性名和字符串模式进行比较,而只是想查明具有该属性名的属性是否一直保存在持久性数据库中。

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

Tags:可爱 Python Python

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