gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:12:11 24 4
gpt4 key购买 nike

在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,而父类(super class)可能需要self 对象。然而,情况并非如此。

最佳答案

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

我会尝试一个赞成/反对的列表:

优点:

  • 明确表示 Multinomial 中的 log_normalizer 与实例无关
  • 保存一个pylint警告

缺点:

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

关于python - 在 Python 中,使用静态方法实现抽象方法的优缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55160214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com