将__call__方法添加到实例后,对象"不可调用"

Rug*_*rra 2 python inheritance callable

我有以下代码

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)
Run Code Online (Sandbox Code Playgroud)

现在,为什么我不能将第二类作为第一类的仿函数?

它似乎工作:

M = Mean()
print M.__call__(data)  # -> 4.5
Run Code Online (Sandbox Code Playgroud)

M有这样的方法__call__:

print '__call__' in dir(M)  # -> True
Run Code Online (Sandbox Code Playgroud)

但它不起作用

print M(data)
Run Code Online (Sandbox Code Playgroud)

我明白了:

TypeError: 'Mean' object is not callable
Run Code Online (Sandbox Code Playgroud)

ise*_*dev 5

正如阿什维尼所说,"特殊方法是在课堂上查找而非实例".

所以以下内容可以按预期工作(虽然我无法想象你为什么要这样做):

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)
Run Code Online (Sandbox Code Playgroud)