查阅了一些关于父类调用子类的问题,这里设计到抽象基类和NotImplementedError
的使用,下面是关于这个问题我所做的一些笔记。
parent.py
class A(object):
def methodA(self):
print('in methodA')
child.py
from parent import A
class B(A):
def methodb(self):
print('am in methodB')
那么如何在parent.py中调用methodb()?
只有当A是一个抽象基类时,这样做才有意义,这意味这A只是用作其他类的基础,而不是直接实例化。如果是这种情况,你将在类A上定义methodB,但保持未实现:
**
parent.py
class A(object):
def methodA(self):
print("in methodA")
def methodB(self):
raise NotImplementedError("Must override methodB")
child.py
from parent import A
class B(A):
def methodB(self):
print("am in methodB")
这不是绝对必要的.如果你没有在A中的任何地方声明methodB并实例化B,你仍然可以从methodA的主体调用methodB,但这是一个不好的做法;不清楚methodA应该来自哪里,或者子类需要覆盖它。
如果您想更正式,可以使用Python abc
模块将A声明为抽象基类:
parent.py
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")
抽象基本类的几大特点:
1:要定义但是并不完整的实现所有方法
2:基本的意思是作为父类
3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白
用抽象基本类的地方:
1:用作父类
2:用作检验实例类型
3:用作抛出异常说明