__getattribute__ 函数从另一个类返回对象值
Posted
技术标签:
【中文标题】__getattribute__ 函数从另一个类返回对象值【英文标题】:__getattribute__ function to return object value from another class 【发布时间】:2016-02-16 12:13:10 【问题描述】:我有一个基类,它有 2 个属性,它们本身来自另一个类。请看下面的代码
class Base(object):
def __init__(self, obj1, obj2):
self.obj1 = obj1
self.obj2 = obj2
def __getattribute__(self, name):
#import pdb; pdb.set_trace()
if name == 'obj1':
obj = object.__getattribute__(self, name) #self.obj1.value
return object.__getattribute__(obj,'value')
class Temp(object):
def __init__(self, value, type):
self.value = value
self.type = type
def __getattribute__(self, name):
#if name == 'value':
# return object.__getattribute__(self, name)
if name == 'type':
return object.__getattribute__(self, name)
if __name__ == "__main__":
temp_obj1 = Temp(45, type(45))
temp_obj2 = Temp('string', type('string'))
base_obj = Base(temp_obj1, temp_obj2)
print base_obj.obj1
print base_obj.obj1.type
及其输出:-
45
Traceback (most recent call last):
File "getattr.py", line 29, in <module>
print base_obj.obj1.type
AttributeError: 'int' object has no attribute 'type'
基本上我想要实现的是我不必调用base_obj.obj1.value
来获取obj1
的value
属性,但调用base_obj.obj1
会得到想要的结果。但同时我可以调用obj1
的某些函数或属性,例如base_obj.obj1.type
或base_obj.obj1.some_method()
但正如您所见,我收到了错误消息。我怎样才能实现所需的功能
【问题讨论】:
【参考方案1】:如果我理解你的问题,你不能做你想做的事,而且,你真的不应该做。无论base_obj.obj1
是什么,base_obj.obj1.type
都会得到type
属性,因为base_obj.obj1.type
意味着(base_obj.ob1).type
--- 也就是说,它首先评估obj1
属性。没有办法让base_obj.obj1
返回一件事,但让base_obj.obj1.type
的base_obj.obj1
部分有所不同。在obj1
的查找发生时,您不知道稍后是否会发生另一个属性查找。
这是有充分理由的。如果这些给出不同的结果,那将是非常混乱的:
# 1
x = base_obj.obj1.type
# 2
tmp = base_obj.obj1
x = tmp.type
如果要获取value
属性,请获取value
属性。如果您希望能够在各种情况下使用 obj1
,就好像它是它的值属性一样,您可以通过重载obj1
上的各种操作来实现您想要的(这样,例如,base_obj.obj1 + 2
有效)。
【讨论】:
以上是关于__getattribute__ 函数从另一个类返回对象值的主要内容,如果未能解决你的问题,请参考以下文章
python__高级 : 类的__getattribute__ 方法