在Python中,使用静态方法实现抽象方法的优缺点是什么?
In Python, what are the pros and cons of implementing an abstract method using a static method?
在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,因为我至少需要真正的类型来调用super,而超类可能需要self
对象。然而,事实并非如此。
从纯粹的 OOP 角度来看,用静态方法覆盖普通方法只是 异端。但是由于 Python 处理方法的方式,语言完全允许它。
我会尝试 pro/con 的列表:
优点:
- 明确表示
Multinomial
中的 log_normalizer
独立于实例
- 保存 pylint 警告
缺点:
- OOP 异端。纯粹主义者会在你之后大喊大叫
- 对于习惯非动态语言(如 C++ 或 Java
的程序员来说,这是一种令人不安的设计
- 不常见的设计,恕我直言,需要评论解释未来的基本原理 readers/mantainers
- 可能是一个有问题的设计的结果:一个方法怎么能在基础 class 中是非静态的(抽象应该无关紧要)而在子class
中是静态的
在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,因为我至少需要真正的类型来调用super,而超类可能需要self
对象。然而,事实并非如此。
从纯粹的 OOP 角度来看,用静态方法覆盖普通方法只是 异端。但是由于 Python 处理方法的方式,语言完全允许它。
我会尝试 pro/con 的列表:
优点:
- 明确表示
Multinomial
中的log_normalizer
独立于实例 - 保存 pylint 警告
缺点:
- OOP 异端。纯粹主义者会在你之后大喊大叫
- 对于习惯非动态语言(如 C++ 或 Java 的程序员来说,这是一种令人不安的设计
- 不常见的设计,恕我直言,需要评论解释未来的基本原理 readers/mantainers
- 可能是一个有问题的设计的结果:一个方法怎么能在基础 class 中是非静态的(抽象应该无关紧要)而在子class 中是静态的