【问题标题】:Object is "not callable" after adding __call__ method to instance [duplicate]将 __call__ 方法添加到实例后,对象“不可调用”[重复]
【发布时间】:2014-03-13 20:46:31
【问题描述】:

我有以下代码

import numpy as np

class Estimator(object):
    name = None

    def __init__(self):
        self.__call__ = self._call

class Mean(Estimator):
    name = 'mean'

    def _call(self, data):
        return np.mean(data)

data = np.arange(10)

现在,为什么我不能将第二个类用作函子作为第一个类?

它似乎有效:

M = Mean()
print M.__call__(data)  # -> 4.5

M 有方法__call__:

print '__call__' in dir(M)  # -> True

但它不起作用

print M(data)

我明白了:

TypeError: 'Mean' object is not callable

【问题讨论】:

  • 特殊方法在类而不是实例中查找。

标签: python inheritance callable


【解决方案1】:

正如 Ashwini 所说,“特殊方法是在类而不是实例中查找的”。

因此,以下内容将按您的预期工作(尽管我无法想象您为什么要这样做):

class Estimator(object):
    name = None

    def __init__(self):
        self.__class__.__call__ = self.__class__._call

class Mean(Estimator):
    name = 'mean'

    def _call(self, data):
        return np.mean(data)

【讨论】:

  • 将类范围内的__call__ 方法设置为新实例的_call 意味着同一类的多个估计器将无法正常工作。
  • @user2357112 解释...在给定的示例中,它将Mean.__call__ 设置为Mean._call。它与实例有什么关系?
  • 不,这是将Mean.__call__设置为self._call,绑定方法。
  • @user2357112 好的,我明白你的意思了...已更新以对班级采取行动。
  • @isedev:我需要它,因为我想在构建类时解决使用__call__ 调用哪个函数。在我的真实代码中,我有两个 _call 函数,基类根据 __init__ 的参数决定使用哪个函数
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 2020-05-31
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多