【问题标题】:Understanding Abstract Base Classes in Python理解 Python 中的抽象基类
【发布时间】:2020-04-03 23:38:56
【问题描述】:

我正在阅读有关抽象基类的信息,并遇到了https://www.python-course.eu/python3_abstract_classes.php 网站。我对它们有了大致的了解,但我发现两个陈述相互矛盾。

Python中抽象类的子类不需要实现父类的抽象方法。

从抽象类派生的类不能被实例化,除非它的所有抽象方法都被覆盖。

我对第一句话的理解是,派生类不需要实现父类的抽象方法,这是错误的。我做了一个示例程序来检查。

from abc import ABC, abstractmethod

class AbstractClassExample(ABC):

    @abstractmethod
    def do_something(self):
        print("Some implementation!")

class AnotherSubclass(AbstractClassExample):

    def just_another_method(self):
        super().do_something()
        print("The enrichment from AnotherSubclass")

x = AnotherSubclass() # TypeError: Can't instantiate abstract class AnotherSubclass with abstract methods do_something
x.do_something()

我想解释一下第一个语句的含义(最好有例子)。

【问题讨论】:

  • 您的代码演示了第一条语句,不是吗?如果您删除x = AnotherSubclass(),那么您的代码将运行而不会出错。
  • 如果我删除它,那么程序中没有任何东西在运行,所以不会有任何错误。我的观点是要实例化AnotherSubclass ,我们必须实现do_something 方法,我认为第一条语句与此相矛盾
  • @Sweeper 哦,我想我现在明白了,我们可以创建类,但不能实例化它?
  • 没错!这就是第一句话所说的。请注意,这比“程序什么都不做,所以当然没有错误!”更微妙。因为如果你尝试在行首删除一些空格,即使你的程序“什么都不做”也会出错。
  • 是的,你的第二条评论明白了。我会发布一个答案。

标签: python oop abstract-class abc


【解决方案1】:

您的代码证明第二个陈述是正确的。它并不表明第一个陈述是错误的。

在您的代码中,您尝试实例化 AnotherSubclass,这是不允许的,因为AnotherSubclass 没有实现所有抽象方法。第二个陈述是这样说的。

但是,如果您删除最后两行,即不实例化AnotherSubclass,那么您的代码在尝试运行时不会产生错误。这表明第一个陈述是正确的 - 不实现其所有抽象方法的抽象类的子类允许存在

您可以编写AnotherSubclass 的另一个子类YetAnotherClass,这一次实现抽象方法,您将能够实例化YetAnotherClass。请注意,您的程序现在做了一些事情,AnotherSubclass 仍然允许存在。

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2018-07-11
    • 2017-01-08
    • 1970-01-01
    • 2016-07-05
    • 2011-06-15
    • 2012-03-01
    • 2012-05-20
    • 2016-02-27
    相关资源
    最近更新 更多