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方法会被调用到吗? 是怎么调用的呢?
首先这里有个错误:
A
类中r1=fun()
这句有问题,应该是r1=self.fun()
,然后又因为你使用了super
关键字,所以A
应该是一个新式类,而非古典类,综上,如果在**Python2**
中,A
的完整定义如下:题主使用了
Python3
,都是新式类,所以写法会略有不同,A
无需主动继承object
。还有,
C
类里少了个双引号……这三个类的最顶层父类是
A
,B
继承A
,C
继承B
。__init__()
的作用有点像其他语言里的构造函数,但并不一样,__init__()
的作用你可以这么理解:所以假如我们创建了一个
A
的实例:a=A()
,那么这个类被创建的时候,自动执行了r1=fun()
这一句,即执行了fun()
方法,执行了raise NotImplementedError
这一句,这句的意思是抛出一个NotImplementedError
异常。你如果创建了
C
类的实例,会发现程序没有抛异常,而仅仅输出了fun in C
。题主的代码里,父类的
__init__()
方法不会自动执行,我们这里的super
关键字强制运行了父类的__init__()
方法,题主可以试着把super
这句话删除(C
或B
里任意一句删除即可),就会发现,fun in C
这句话都不输出了,这也证明了父类的__init__()
方法不会自动执行。造成这一现象的原因是:一旦子类
覆盖/覆写(overwrite)
了父类的的某一个方法,那么我们在创建一个子类的实例时,就会运行子类中编写的内容,如果子类没有覆盖父类的方法,那么程序中用子类实例调用某个方法时,便会调用父类的方法。C
和B
类都覆盖了__init__()
方法,一层一层最终是调用了A
类中r1 = self.run()
这一句,因此在C
的实例被创建时,相当于在__init__()
方法中执行了r1 = self.run()
,又因为,C
类覆盖了run()
方法,因此,这一句执行的实际上是C
类的run()
方法,输出fun in C
,而不是抛异常。