python的__getattribute__()方法

w597766166 2011-04-05 04:13:12
直接上代码:

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了很多,还是有疑问,请高手赐教,多谢了!
...全文
733 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
susu2012 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,不然会陷入无穷递归,你可以查看下新式类的相关文档说明!

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧