只有当A是一个抽象基类时,这样做才有意义,这意味着A只是用作其他类的基础,而不是直接实例化.如果是这种情况,您将在类A上定义methodB,但保持未实现:
class A(object):
def methodA(self):
print("in methodA")
def methodB(self):
raise NotImplementedError("Must override methodB")
from parent import A
class B(A):
def methodB(self):
print("am in methodB")
这不是绝对必要的.如果你没有在A中的任何地方声明methodB并实例化B,你仍然可以从methodA的主体调用methodB,但这是一个不好的做法;不清楚methodA应该来自哪里,或者子类需要覆盖它.
如果您想更正式,可以使用Python abc
模块将A声明为抽象基类.
from abc import ABCMeta, abstractmethod
class A(object):
__metaclass__ = ABCMeta
def methodA(self):
print("in methodA")
@abstractmethod
def methodB(self):
raise NotImplementedError("Must override methodB")
使用它实际上会阻止您在不重写methodB的情况下实例化A或任何继承自A的类.例如,如果B看起来像这样:
class B(A):
pass
尝试实例化它时会出错:
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't instantiate abstract class B with abstract methods methodB
如果您尝试实例化A,也会发生同样的情况.