WEB开发网
开发学院软件开发Python [Python 学习笔记] 9: Class 阅读

[Python 学习笔记] 9: Class

 2009-10-13 00:00:00 来源:WEB开发网   
核心提示: 原来,Python Class 对象或类型通过内置成员 __dict__ 来存储成员信息,[Python 学习笔记] 9: Class(7),我们还可以通过重载 __getattr__ 和 __setattr__ 来拦截对成员的访问,需要注意的是 __getattr__ 只有在访问不存在的成员时

原来,Python Class 对象或类型通过内置成员 __dict__ 来存储成员信息。

我们还可以通过重载 __getattr__ 和 __setattr__ 来拦截对成员的访问,需要注意的是 __getattr__ 只有在访问不存在的成员时才会被调用。

>>> class Class1:
  def __getattr__(self, name):
    print "__getattr__"
    return None
  def __setattr__(self, name, value):
    print "__setattr__"
    self.__dict__[name] = value
    
>>> a = Class1()
>>> a.x
__getattr__
>>> a.x = 123
__setattr__
>>> a.x
123

如果类型继承自 object,我们可以使用 __getattribute__ 来拦截所有(包括不存在的成员)的获取操作。

注意在 __getattribute__ 中不要使用 "return self.__dict__[name]" 来返回结果,因为在访问 "self.__dict__" 时同样会被 __getattribute__ 拦截,从而造成无限递归形成死循环。

>>> class Class1(object):
  def __getattribute__(self, name):
    print "__getattribute__"
    return object.__getattribute__(self, name)
  
>>> a = Class1()
>>> a.x
__getattribute__
Traceback (most recent call last):
 File "<pyshell#3>", line 1, in <module>
 a.x
 File "<pyshell#1>", line 4, in __getattribute__
 return object.__getattribute__(self, name)
AttributeError: 'Class1' object has no attribute 'x'
>>> a.x = 123
>>> a.x
__getattribute__
123

上一页  2 3 4 5 6 7 

Tags:Python 学习 笔记

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