python - 抽象类可以是子类吗?
问题描述
from abc import ABC, abstractmethod
class A(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def something():
pass
class B(A):
pass
我仍然是学习 OOP 的新手,所以我想问一下。我知道抽象类被认为是超类,但是抽象类也可以是子类吗?
以代码为例,B
继承自A
但不覆盖中的抽象方法A
,这是否意味着B
仍将其视为抽象类以及子类A
?
解决方案
首先,什么是抽象类?它是一个类,将用作子类的“骨架”。现在回答你的问题......
那么这是否意味着 B 仍然被视为抽象类以及 A 的子类?
是的,因为所有方法都没有被覆盖,而且它们是抽象的。
以这段代码为例:
from abc import ABC, abstractmethod
class A(ABC):
@abstractmethod
def foo(self):
pass
@abstractmethod
def bar(self):
pass
class B(A):
def foo(self):
return 'Foo implementation'
在这里,该类B
仍然是抽象的,因为其中一种方法是抽象的并没有被覆盖。所以如果你尝试创建一个实例,你会得到这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class InstrumentName with abstract methods bar
在这里我们可以看到这个类继承自A
,但是是一个具体的类,因为方法被覆盖了:
class C(A):
def foo(self):
pass
def bar(self):
pass
c = C()
c.foo()
此代码运行没有错误。
简而言之,只要方法没有被覆盖,抽象类的子类仍然是抽象类。
推荐阅读
- xero-api - 如何批量获取详细的联系人
- sql - 从 SQL Oracle 导出/创建 XML 文件
- f# - 来自 csv 的 F# 图表
- swift - 想要通过单击 swift 中的按钮之一来更改按钮标题?
- java - 无法以编程方式更改工厂颜色的任何解决方案
- spring-batch - 批处理应用程序中的计划作业有时会引发错误
- typescript - 如何在打字稿中将带符号的数字输入到数组中
- xamarin.forms - Xamarin Forms 4.1.0:找不到方法:void .ResourceLoadingQuery.set_Instance(object)
- java - 执行 .sql 文件时如何获取 oracle 错误
- excel - 从除 i 之外的 ListBox 中删除项目