python 2中__getattr __(self,__ getitem__)的内部

时间:2016-09-29 05:03:20

标签: python python-2.7

在python2中,这个旧式的类:

class C:
    x = 'foo'
    def __getattr__(self, name):
        print name
        print type(name)
        return getattr(self.x, name)

> X = C()
> X[1]
__getitem__
<type 'str'>
'o'

问题是,这个问题的内容是怎么回事?更具体地说,如果name只是一个字符串,那么如何存储索引1,以便getattr知道必须调用__getitem__(1)来检索字符o }?

1 个答案:

答案 0 :(得分:2)

要切断它,这就是一步一步发生的事情。

当您致电X[1]时,它会尝试在您的班级中查找名为__getitem__的属性。由于您没有具有该名称的任何属性(函数或变量),因此它将使用其请求的属性(__getattr__)的名称来调用您的__getitem__方法。这个名字总是一个字符串。

当您执行"return getattr(self.x, name)"时,您实际正在做的是返回“foo”的__getitem__方法,即"foo".__getitem__,然后使用参数1调用"foo".__getitem__(1):{{1} }与"foo"[1]相同,后者返回第一个“o”。