首页 > 解决方案 > 在 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对象。然而,情况并非如此。

标签: pythonstatic-methodsimplementsabstract-methods

解决方案


从纯粹的 OOP 的角度来看,用静态方法覆盖普通方法只是异端。但由于 Python 处理方法的方式,该语言完全允许这样做。

我将尝试列出赞成/反对的清单:

优点:

  • 明确表明log_normalizerinMultinomial独立于实例
  • 保存 pylint 警告

缺点:

  • OOP 异端。纯粹主义者会在你之后大喊大叫
  • 对于习惯于 C++ 或 Java 等非动态语言的程序员来说,设计令人不安
  • 不常见的设计,恕我直言,需要评论来解释未来读者/维护者的基本原理
  • 可能是一个有问题的设计的结果:一个方法如何在基类中是非静态的(抽象应该无关紧要)而在子类中是静态的

推荐阅读