摘要 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 只要方法没有被覆盖。
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 的“骨架”。 现在回答你的问题....
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 只要方法没有被覆盖。