查阅了一些关于父类调用子类的问题,这里设计到抽象基类和NotImplementedError的使用,下面是关于这个问题我所做的一些笔记。

    1. parent.py
    2. class A(object):
    3. def methodA(self):
    4. print('in methodA')
    5. child.py
    6. from parent import A
    7. class B(A):
    8. def methodb(self):
    9. 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:用作抛出异常说明