python - 抽象类可以是子类吗?

标签 python oop

from abc import ABC, abstractmethod

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

我对 OOP 还很陌生,所以我想问这个问题。我知道抽象类被认为是父类(super class),但是抽象类也可以是子类吗?

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

最佳答案

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

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'

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

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

在这里我们可以看到这个类继承自A,但它是一个具体类,因为方法被重写了:

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

    def bar(self):
        pass

c = C()
c.foo()

此代码运行没有错误。

简而言之,只要方法不被重写,抽象类的子类仍然是抽象类。

关于python - 抽象类可以是子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69702609/

相关文章:

php - 这个 PHP 库中的 '\' 是什么意思?

entity-framework - 数据库设计 : more tables vs less tables

php - 大型应用ActiveRecord的设计问题

python - 将 3 列的文本文件转换为 Python 中 dict 的嵌套 dict

python - 使用正则表达式查找数字后跟点

python - PySpark:将 RDD 转换为数据框中的列

python - 想要隐藏 "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" } from ping module output?

c++ - 在头文件中定义类是否正确?

java - 合并排序抛出 StackOverflowError

python - 在函数本身中打印函数名称