摘要 class 可以是子 class 吗?

Can an abstract class be a subclass?

from abc import ABC, abstractmethod

class A(ABC):
    
    def __init__(self, name):
        self.name = name
        
    @abstractmethod
    def something():
        pass
    
class B(A):
    pass

我对学习 OOP 还是个新手,所以我想问这个问题。我知道抽象 class 被认为是超级 class,但是抽象 class 也可以是子 class 吗?

以代码为例,B继承自A,但没有重写A中的抽象方法,那么是否意味着B仍然是被认为是抽象 class 以及 A?

的子class

是的。只要不重写所有的抽象方法,子类还是抽象的。

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

So does this mean that B is still considered an abstract class as well as as a subclass of 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'

在这里,class B 仍然是抽象的,因为其中一个方法没有被重写,它是抽象的。因此,如果您尝试创建它的一个实例,您将收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class B with abstract methods bar

这里我们可以看到这个class继承自A,但是是一个具体的class,因为方法被覆盖了:

class C(A):
    def foo(self):
        pass

    def bar(self):
        pass

c = C()
c.foo()

这段代码运行没有错误。

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