我有一个源自 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/