python - 对于抽象类来说,实例化的最佳方法是什么?

标签 python oop overriding abstract-class abstract-methods

据我目前的理解(请注意我的话中定义的正确性):我们应该在抽象类中声明我们的抽象方法,并将这些方法的实现引导到子类或派生类中。

现在我有 1 个问题:

  1. 在基类(抽象类)中进行实例化是否有用或常见?

或者,如果没有:

我们应该在派生类(子类)中进行实例化还是在两者中进行实例化?

哪一个更好做,还是说Pythonic更好?

或者你可能会说这并不重要......如果是这种情况请告诉我为什么。

例如,这个:

from abc import abstractmethod, ABC


class Athlete(ABC):
    def __init__(self, name: str,  mass: int, height: int, nationality: str):
        self.name = name
        self.mass = mass
        self.height = height
        self.nationality = nationality
    @abstractmethod
    def run(self):
        pass
    def play(self):
        pass
    def exercise(self):
        pass
    def sleep(self):
        pass


class SoccerPlayer(Athlete):
    def run(self):
        print(f"{self.name} is running")
    def play(self):
        print(f"{self.name} with {self.height} is running to save his {self.nationality} nation.")
    def exercise(self):
        print(f"{self.name} is exercising to fit his {self.mass}")
    def sleep(self):
        print(f"{self.name} is sleeping 8 h a day to increase his {self.height}m height.")


player = SoccerPlayer('ali', 200, 180, 'american')
player.run()

最佳答案

对于测试,实例化抽象基类可能会很方便。做起来也相当简单。不过,不要在生产代码中执行此操作。

您需要做的就是清空Athlete.__abstractmethods__

>>> Athlete("bob", 100, 200, "american")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Athlete with abstract methods run
>>> Athlete.__abstractmethods__
frozenset({'run'})
>>> Athlete.__abstractmethods__ = frozenset()
>>> Athlete("bob", 100, 200, "american")
<__main__.Athlete object at 0x10c9c0410>

关于python - 对于抽象类来说,实例化的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59335079/

相关文章:

python - 如何在外部函数中重新绑定(bind)名称?

python - 在 ubuntu 中安装 imutils

java - super 函数在java中是如何工作的?

magento - 在社区扩展中覆盖 Magento Controller

python - 在 python 中打印两个骰子可能掷出的二维列表

python - 从具有多重继承的类中检索参数

javascript - 为什么这个函数可以工作但仍然返回 typeError ... is not a function?

c# - 帮助 c# 模式

java - 如何巧妙地克服静态属性不能被覆盖的事实?

java - 访问我自己的 EventListener 方法