【发布时间】: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