如何同时实现__getitem__和__getattr__?

时间:2015-04-11 00:25:15

标签: python-3.x

假设我有一个类,其中数据存储在多个属性中,但该类的用户只能看到一个数据。例如:

class TestClass:
    def __init__(self):
        self.a = [1, 2, 3, 4]
        self.b = [-4, -3, -2, -1]

    def __getitem__(self, item):
        return [(self.a[elem] if elem < len(self.a) else self.b[elem - len(self.a)]) 
                for elem in item]

然后,我可以定义:

In[]: x = TestClass()
Out[]: x[(1,3,5,6)]
[2, 4, -3, -2]

现在,为此添加一些功能会非常好,例如

           x[(1,3,5,6)].mean()           (or some other function)

一种方法是重新定义一个新类TestClassSuper

class TestClassSuper:
    def __init__(self, value):
        self.value = value

    def mean(self):
        return mean(self.value)

然后修改__getitem__中的TestClass函数以返回

    def __getitem__(self, item):
        return TestClassSuper([(self.a[elem] if elem < len(self.a) 
                                             else self.b[elem - len(self.a)]) 
                                for elem in item]) 

但是,我想知道是否有另一种方法可以定义__getattr__来处理x[(1,3,5,6)].mean()内部TestClass之类的调用,而不是定义TestClassSuper包装器?

我正在使用Python 3.4

1 个答案:

答案 0 :(得分:1)

没有。首先执行项访问,然后对结果执行属性查找。没有办法将两者合并为一个操作。