python的__getattribute__()方法
时间:2011-04-05
来源:互联网
直接上代码:
Python code
输出:
xxx
defaultValue
以上在B类中定义了def __getattribute__(self,obj) 函数后,当我访问a.x的时候,正确输出'xxx'
但是访问b.y的时候,根据《python核心编程》上的说法:
优先级__getattribute__ > 实例的__dict__ > 父类的__dict__ > __getattr__
那么应该输出 200 ,而不是 defaultValue
还有就是当调用b.say()的时候,也出错,是不是__getattribute__的设置太过霸道了,“劫持”了实例b
所有的属性和方法啊!
感到非常困惑,GOOGLE了很多,还是有疑问,请高手赐教,多谢了!
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,不然会陷入无穷递归,你可以查看下新式类的相关文档说明!
if obj == 'x':
return 'xxx'
else:
raise AttributeError
改成 else:
return object.__getattribute__(self,obj)
即可,那个优先级顺序是严格遵守的,没有问题
还有object.__getattribute__(self,obj)中一定要用object,不然会陷入无穷递归,你可以查看下新式类的相关文档说明!
作者: wangsuyi640 发布时间: 2011-04-05
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28