python - 在 Python 中向 __call__ 方法添加验证

标签 python python-3.x inheritance design-patterns composition

我有一个源自 Function 类的大型类层次结构(例如 SineFunction 是一个子类),并且所有这些类都实现了 __call__ 方法,以及其他方法(例如推导或更专业的数值方法)。

根据输入类型向每个 __call__ 方法添加通用逻辑的最简洁方法是什么?正式来说,我想要类似的东西

def __call__(self,x):
    if isinstance(x,Distribution):
        return FunctionDistribution(x,self)
    else:
        # Go back to previous logic

对于Function的每个子类。我可以在每次实现 __call__ 时添加 super() ,但这会很痛苦。有什么更容易实现这一点吗?

最佳答案

像这样怎么样?

class BaseFunction(object):
    def __call__(self, x):
        if isinstance(x, BaseFunction):
            return self._call(x)
        else:
            print("Fallback logic goes here")

    def _call(self):
        raise NotImplementedError

class ChildFunction(BaseFunction):
    def _call(self, x):
        print("Child function executed on x")

子类各自定义_call,回退逻辑驻留在父类中。

一个例子:

>>> a = BaseFunction()
>>> b = ChildFunction()
>>> c = 3
>>> b(a)
Child function executed on x
>>> b(c)
Fallback logic goes here

社论:

顺便说一句,我对您的特定用例不太了解,但我的理解是 isinstance 通常不是理想的选择,最好执行某种 duck typing 。在这种情况下,您可能需要将 if(isinstance(...) 语句替换为 try/ except block ,其中您只需使用接口(interface)就好像 x 实现BaseFunction 接口(interface)。

关于python - 在 Python 中向 __call__ 方法添加验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612086/

相关文章:

python - 首先保留在列表中发现的重复项目

python - 使用 sqlalchemy 0.6 记录查询

php - Python urlencode 不会用数组编码值

python - 如何在CentOS7中安装python3的python包

wpf - 有没有更好的方法在 WPF 中继承窗口

c++ - 类中的 ostream 没有类型

python - 使用 Nginx 反向代理部署 Pylons?

python - 为 python3 安装 libxml2 绑定(bind)

python - 当不需要分配结果时如何调用Python函数

C++ 析构函数行为