__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 来获取obj1value 属性,但调用base_obj.obj1 会得到想要的结果。但同时我可以调用obj1 的某些函数或属性,例如base_obj.obj1.typebase_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.typebase_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__ 方法

Python-魔法函数__getattr__()与__getattribute__()的区别

13 内建属性 _getattribute_ 内建函数

python 内置函数

python的callback函数原理

调用 if __name__ == '__main__':在一个模块中从另一个模块中的函数 [关闭]