我有一个基类,它有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
来获取value
的{{1}}属性,但是调用obj1
会给出期望的结果。但与此同时,我可以调用base_obj.obj1
或obj1
base_obj.obj1.type
的某些功能或属性
但是你可以看到我收到错误。如何实现所需的功能
答案 0 :(得分:1)
如果我理解你的问题,你就不能做你想做的事情,而且你真的不应该这样做。无论base_obj.obj1
是什么,base_obj.obj1.type
都会获得type
属性,因为base_obj.obj1.type
表示(base_obj.ob1).type
---即评估obj1
首先是属性。没有办法让base_obj.obj1
返回一件事,但base_obj.obj1
base_obj.obj1.type
部分会有所不同。在obj1
的查找发生时,您不知道是否将在稍后进行另一个属性查找。
这有充分的理由。如果这些结果不同,那将是非常令人困惑的:
# 1
x = base_obj.obj1.type
# 2
tmp = base_obj.obj1
x = tmp.type
如果您想获取value
属性,请获取value
属性。如果您希望能够在各种情况下使用 obj1
,就像它的值属性一样,您可以通过在obj1
上重载各种操作来实现您想要的效果(例如,base_obj.obj1 + 2
有效)。