__getattribute__函数从另一个类返回对象值

时间:2015-11-15 08:16:33

标签: python django django-models metaclass getattr

我有一个基类,它有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.obj1obj1

base_obj.obj1.type的某些功能或属性

但是你可以看到我收到错误。如何实现所需的功能

1 个答案:

答案 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有效)。