在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
  • 中是静态的