python - 在 Python 中,使用静态方法实现抽象方法的优缺点是什么?
问题描述
在 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 似乎很奇怪。
在协作多重继承的情况下,我不能使用静态方法,因为我至少需要真正的类型才能调用 super,而超类可能需要self
对象。然而,情况并非如此。
解决方案
从纯粹的 OOP 的角度来看,用静态方法覆盖普通方法只是异端。但由于 Python 处理方法的方式,该语言完全允许这样做。
我将尝试列出赞成/反对的清单:
优点:
- 明确表明
log_normalizer
inMultinomial
独立于实例 - 保存 pylint 警告
缺点:
- OOP 异端。纯粹主义者会在你之后大喊大叫
- 对于习惯于 C++ 或 Java 等非动态语言的程序员来说,设计令人不安
- 不常见的设计,恕我直言,需要评论来解释未来读者/维护者的基本原理
- 可能是一个有问题的设计的结果:一个方法如何在基类中是非静态的(抽象应该无关紧要)而在子类中是静态的
推荐阅读
- kubernetes - 如何在 Kubernetes 中修改 continue 令牌的默认过期时间?
- php - 关联数组将值连接到另一个关联数组
- javascript - 切换主题的最佳方式?
- php - 如何使用php将一个变量变为多个变量?
- sql - 如何获取每一行的 top dept_id
- c++ - 同时在字符串数组中使用插入、删除和搜索时遇到问题
- c++ - 程序查找两个数字的乘积
- node.js - 从 bash 中调用的异步 nodejs 函数返回一个字符串
- php - 使用 .htaccess 将 url 从 profile.php?user=myUsername 更改为 profile/myUsername
- scala - 在Scala中计算大n的二项式系数