+ -
当前位置:首页 → 问答吧 → python的__getattribute__()方法

python的__getattribute__()方法

时间:2011-04-05

来源:互联网

直接上代码:
Python code

class B(object):
    version = 2.0
    def __init__(self,x):
        self.x = x
        self.y = 200
    
    def __getattribute__(self,obj):
        if obj == 'x':
            return 'xxx'
        else:
            raise AttributeError
    
    def __getattr__(self,obj):
        return 'defaultValue'   

    def say(self):
        print 'this is B'
        
b = B(100)
print b.x
print b.y


输出:
xxx
defaultValue

以上在B类中定义了def __getattribute__(self,obj) 函数后,当我访问a.x的时候,正确输出'xxx'
但是访问b.y的时候,根据《python核心编程》上的说法:
优先级__getattribute__ > 实例的__dict__ > 父类的__dict__ > __getattr__
那么应该输出 200 ,而不是 defaultValue

还有就是当调用b.say()的时候,也出错,是不是__getattribute__的设置太过霸道了,“劫持”了实例b
所有的属性和方法啊!
感到非常困惑,GOOGLE了很多,还是有疑问,请高手赐教,多谢了!

作者: w597766166   发布时间: 2011-04-05

def __getattribute__(self,obj):
  if obj == 'x':
  return 'xxx'
  else:
  raise AttributeError

改成 else:
  return object.__getattribute__(self,obj)
即可,那个优先级顺序是严格遵守的,没有问题
还有object.__getattribute__(self,obj)中一定要用object,不然会陷入无穷递归,你可以查看下新式类的相关文档说明!

作者: wangsuyi640   发布时间: 2011-04-05

热门下载

更多