只有当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^{}模块将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,也会发生同样的情况。