我试着理解以下代码。
class Chain(object):
def __init__(self, path=''):
self._path = path
def __getattr__(self, path):
return Chain('%s/%s' % (self._path, path))
def __str__(self):
return self._path
__repr__ = __str__
def __call__(self, path):
return Chain('%s/%s' % (self._path, path))
print (Chain().abc.efg("string").repos)
输出结果为:
/abc/efg/string/repos
我不明白为什么__call__
方法未在Chain(/abc)
中调用,而是在Chain(/abc/efg)
中调用
答案 0 :(得分:2)
__getattr__
用于在类实例上进行属性查找。当一个类实例用作函数时使用__call__
。
Chain() # creates a class instance
Chain().abc # calls __getattr__ which returns new instance
Chain().abc.efg # calls __getattr__ which returns new instance
Chain().abc.efg("string") # calls __call__
__getattr__
只能处理python识别为有效变量名的字符串。当需要不符合要求的字符串时,__call__
非常有用。因此,例如,Chain().abc.def("some string with spaces")
就是一个很好的例子。
答案 1 :(得分:0)
abc
被视为属性而非方法调用。因此,应由__getattr__
代替__call__
处理。