在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
}?
答案 0 :(得分:2)
要切断它,这就是一步一步发生的事情。
当您致电X[1]
时,它会尝试在您的班级中查找名为__getitem__
的属性。由于您没有具有该名称的任何属性(函数或变量),因此它将使用其请求的属性(__getattr__
)的名称来调用您的__getitem__
方法。这个名字总是一个字符串。
当您执行"return getattr(self.x, name)"
时,您实际正在做的是返回“foo”的__getitem__
方法,即"foo".__getitem__
,然后使用参数1调用"foo".__getitem__(1)
:{{1} }与"foo"[1]
相同,后者返回第一个“o”。