什么时候会调用python __call__?

时间:2016-07-21 16:05:10

标签: python

我试着理解以下代码。

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)中调用

2 个答案:

答案 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__处理。