将__getitem__转发给getattr

时间:2010-09-13 13:31:35

标签: python

有人能解释一下这里发生了什么吗?

class Test(object):
    __getitem__ = getattr

t = Test()
t['foo']

给出错误(在Python 2.7和3.1中):

TypeError: getattr expected at least 2 arguments, got 1

,而:

def f(*params):
     print params    # or print(params) in 3.1

class Test(object):
    __getitem__ = f

打印出我期望的两个参数。

2 个答案:

答案 0 :(得分:6)

令人困惑的是,内置函数(以及某些其他类型的callables)不会成为正常函数在类中使用时绑定的方法:

>>> class Foo(object): __getitem__ = getattr
>>> Foo().__getitem__
<built-in function getattr>

与:相比:

>>> def ga(*args): return getattr(*args)
>>> class Foo(object): __getitem__ = ga
>>> Foo().__getitem__
<bound method Foo.ga of <__main__.Foo object at 0xb77ad94c>>

因此,getattr未正确接收第一个('self')参数。你需要编写一个普通的方法来包装它。

答案 1 :(得分:0)

在没有'self'参数的情况下调用getattr,因为它已分配给对象属性。

你想这样做:

__getitem__ = lambda *a, **k: getattr(*a, **k)

这将为您提供您想要的输出。