__call__ 行为

__call__ behavior

我不理解__call__的行为:

class Filter:
    def __init__(self, before, after, source):
        self.filter = {}
        self.filter['before:'] = before
        self.filter['after:'] = after
        self.filter['source:'] = source

    def __call__(self):
        return ' AND '.join([key + value for key, value in self.filter.items()])

当我调用实例时,__call__没有执行:

print(Filter(before='today', after='yesterday', source='web'))

returns <__main__.Filter object at 0x103f2bf10>

同时

print(Filter(before='today', after='yesterday', source='web').__call__())

做我想做的事 returns 做 __call__() 中定义的事:before:today AND after:yesterday AND source:web

为什么会这样?我是否需要先创建一个空对象,然后实例化它,才能使 __call__ 工作?

Filter(...) 不是 "call" 实例,它创建实例。要调用,请在结果对象上使用调用语法:

>>> Filter(...)()

>>> filt = Filter(...)
>>> filt()

Filter(before='today', after='yesterday', source='web') 中,您不调用实例,而是创建实例。当你 print 它时,你会得到 class Filter 实例的默认表示:<__main__.Filter object at 0x103f2bf10>

您需要先创建实例,然后调用它:

filter = Filter(before='today', after='yesterday', source='web')
filter()

输出:

'before:today AND after:yesterday AND source:web'

无需明确使用 <your instance>.__call__(),只需像对任何函数一样使用括号即可。