在Python中,使用静态方法实现抽象方法有什么优缺点?
例如,
import numpy as np
class ExponentialFamily:
@abstractmethod
def log_normalizer(self, q):
raise NotImplementedError
class Multinomial(ExponentialFamily):
@staticmethod
def log_normalizer(q):
max_q = np.maximum(0.0, np.amax(q))
q_minus_max_q = q - max_q
return max_q + np.logaddexp(-max_q, np.logaddexp.reduce(q_minus_max_q))
class NegativeBinomial(ExponentialFamily):
def __init__(self, r):
super().__init__()
self.r = r
def log_normalizer(self, q):
return -self.r * np.log1p(-mf.exp(q))
一方面,我知道 pylint 会更少提示 self
未被使用。另一方面,在这里使用 staticmethod 似乎很奇怪。
在协作多重继承的情况下,我无法使用 staticmethod,因为我至少需要 true 类型来调用 super,而父类(super class)可能需要 self 对象。然而,情况并非如此。
最佳答案
从纯粹的 OOP 角度来看,用静态方法覆盖普通方法只是异端。但由于 Python 处理方法的方式,该语言完全允许这样做。
我将尝试列出赞成/反对的 list :
优点:
- 明确指出
Multinomial
中的log_normalizer
与实例无关 - 保存 pylint 警告
缺点:
- OOP 异端。纯粹主义者会在你身后大喊
- 对于习惯 C++ 或 Java 等非动态语言的程序员来说,这种设计令人不安
- 不常见的设计,恕我直言,需要注释为 future 的读者/维护人员解释其基本原理
- 可能是有问题的设计的结果:一个方法如何在基类中是非静态的(抽象应该不重要)而在子类中是静态的
关于python - 在Python中,使用静态方法实现抽象方法有什么优缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55160214/