素材牛VIP会员
python继承调用问题
 12***om  分类:Python  人气:1017  回帖:1  发布于6年前 收藏

class A:

def __init__(self):
    r1=fun()
def fun(self):
    raise NotImplementedError

class B(A):

def __init__(self):
    super(B,self).__init__()
def fun(self):
    print("fun in B")

class C(B):

def __init__(self):
    super(C,self).__init__()
def fun(self):
    print("fun in C)

c=C()

这里会初始化一个C实例,然后在C中会调用B的init 方法,然后在B的init方法中调用A的init方法,但是在A的init方法中会有个fun的方法是 raise NotImplementedError 是什么意思?这个函数是什么作用?然后在实例化C的过程中会调用到A中的fun方法吗?然后B和C中的fun方法会被调用到吗? 是怎么调用的呢?

 标签:python

讨论这个帖子(1)垃圾回帖将一律封号处理……

Lv6 码匠
素***2 学生 6年前#1

首先这里有个错误:A类中r1=fun()这句有问题,应该是r1=self.fun(),然后又因为你使用了super关键字,所以A应该是一个新式类,而非古典类,综上,如果在**Python2**中,A的完整定义如下:

class A(object):
    def __init__(self):
        r1 = self.fun()
        
    def fun(self):
        raise NotImplementedError

题主使用了Python3,都是新式类,所以写法会略有不同,A无需主动继承object
还有,C类里少了个双引号……

这三个类的最顶层父类是AB继承AC继承B
__init__()的作用有点像其他语言里的构造函数,但并不一样,__init__()的作用你可以这么理解:

在类被创建的时候,该方法自动执行。

所以假如我们创建了一个A的实例:a=A(),那么这个类被创建的时候,自动执行了r1=fun()这一句,即执行了fun()方法,执行了raise NotImplementedError这一句,这句的意思是抛出一个NotImplementedError异常。

但是

你如果创建了C类的实例,会发现程序没有抛异常,而仅仅输出了fun in C

为什么?

题主的代码里,父类的__init__()方法不会自动执行,我们这里的super关键字强制运行了父类的__init__()方法,题主可以试着把super这句话删除(CB里任意一句删除即可),就会发现,fun in C这句话都不输出了,这也证明了父类的__init__()方法不会自动执行。

造成这一现象的原因是:一旦子类覆盖/覆写(overwrite)了父类的的某一个方法,那么我们在创建一个子类的实例时,就会运行子类中编写的内容,如果子类没有覆盖父类的方法,那么程序中用子类实例调用某个方法时,便会调用父类的方法。

CB类都覆盖了__init__()方法,一层一层最终是调用了A类中r1 = self.run()这一句,因此在C的实例被创建时,相当于在__init__()方法中执行了r1 = self.run(),又因为,C类覆盖了run()方法,因此,这一句执行的实际上是C类的run()方法,输出fun in C,而不是抛异常。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取