python - 在Python中,使用静态方法实现抽象方法有什么优缺点?

标签 python static-methods implements abstract-methods

在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/

相关文章:

python - 增加循环内范围的上限不会使其永远运行

c# - 同名的静态方法和扩展方法

java - Android AudioFocus onAudioFocusChange 不监听更改

python - 将深层嵌套的 json 从 facebook 转换为 python 中的数据框

python - jupyter notebook ipython 小部件显示为文本

javascript - 如何在coffeeScript中强制使用 "this"?

在 C 中调用带有全局变量的静态函数

java - 使用接口(interface)时如何为类赋值?

java - 为什么我的变量无法接收值(接口(interface))

python - 使用 django-filters 设置初始值?