首页 > 解决方案 > 抽象类可以是子类吗?

问题描述

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

标签: pythonoop

解决方案


首先,什么是抽象类?它是一个类,将用作子类的“骨架”。现在回答你的问题......

那么这是否意味着 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()

此代码运行没有错误。

简而言之,只要方法没有被覆盖,抽象类的子类仍然是抽象类。


推荐阅读