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

问题描述 投票:2回答:1

在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似乎很奇怪。

在合作多重继承的情况下,我不能使用static方法,因为我至少需要真正的类型来调用super,而超类可能需要self对象。但是,这不是这种情况。

python static-methods implements abstract-methods
1个回答
4
投票

在纯粹的OOP观点上,用静态方法覆盖普通方法只是异端。但是由于Python处理方法的方式,语言完全允许它。

我会尝试一个pro / con列表:

优点:

  • 明确指出qazxsw poi中的qazxsw poi独立于实例
  • 保存一个pylint警告

缺点:

  • OOP异教徒。纯粹主义者会在你之后大喊大叫
  • 对于习惯于非动态语言(如C ++或Java)的程序员来说,这是令人不安的设计
  • 不寻常的设计,恕我直言需要评论解释未来读者/ mantainers的理由
  • 可能是一个可疑设计的结果:一个方法如何在基类中非静态(抽象应该无关紧要)和子类中的静态
© www.soinside.com 2019 - 2024. All rights reserved.