【问题标题】:__call__ behavior [duplicate]__call__ 行为 [重复]
【发布时间】:2020-04-20 01:20:01
【问题描述】:

我不明白__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'))

返回<__main__.Filter object at 0x103f2bf10>

同时

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

做我想做的事并返回__call__()中定义的内容:before:today AND after:yesterday AND source:web

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

【问题讨论】:

  • Filter(before='today', after='yesterday', source='web') 不调用实例,而是调用构造函数Filter。调用实例将是 Filter(before='today', after='yesterday', source='web')() 尽管这似乎是对 __call__ dunder 方法的一种非常奇怪的用法......

标签: python python-3.7


【解决方案1】:

Filter(before='today', after='yesterday', source='web') 中,您不调用实例,而是创建实例。当您 print 它时,您将获得 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__(),只需像对任何函数一样使用括号即可。

【讨论】:

    【解决方案2】:

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

    >>> Filter(...)()
    

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

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 1970-01-01
      • 2013-07-25
      • 2022-10-14
      • 2015-06-20
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      相关资源
      最近更新 更多