学习笔记(Python继承)
有几种叫法(父类-子类、基类-派生类)
先拿代码演示一下:
1 class father: 2 def work(self): 3 print("work>>>>>") 4 5 def car(self): 6 print("car>>>>>>>>>") 7 8 class son(father): #想要继承就得添加父类 9 def study(self): 10 print("study>>>>>>>>>>") 11 12 obj = son() 13 obj.work() #在上面方法中,work中的self是形参,此时指向的是obj 14 #除此之外还很重要的是,self永远指向调用方法的调用者(比如这里指向obj) 15 #work>>>>>
由上述代码可以看出此时obj是调用子类的对象,但是却可以使用父类的方法,其主要原因是子类后添加了父类,如果没有加父类,则调用不了父类的方法从而报错,这种形式叫做继承
(self 永远指向调用方法的调用者)
(下面类中重写父类中的work方法,先别去想太多限制)
1 class son(father): 2 def study(self): 3 print("study>>>>>>>>>>") 4 5 def work(self): 6 print("s.work") #不想继承就自己写(重写) 7 8 #此时在调用方法时,先从子类的方法中查找,如果有该方法则先调用,没有的话就去父类中调用 9 obj = son() 10 obj.work() #s.work
1 def work(self): 2 print("s.work") 3 super(son,self).work() #方一:调用super方法,super(当前类的名,self).父类被重写的方法()) 4 father.work(self) #方二:这种方法是主动调用父类方法,此时的self需要我们主动添加,表示父类也要执行其对象方法
1 class uncle: 2 def video(self): 3 print("uncle.video") 4 class father(uncle): 5 def work(self): 6 print("father.work") 7 class mother: 8 def car(self): 9 print("mother.car") 10 11 class son(father,mother): 12 def study(self): 13 print("son.study")
obj = son() obj.car() # mother.car
(此时是先在father类中找car()方法,没有则再跳转到mother类中)
obj = son() obj.video() # uncle.video
class aunt: def computer(self): print("aunt.computer") class uncle: def video(self): print("uncle.video") class father(uncle): def work(self): print("father.work") class mother(aunt): def car(self): print("mother.car") class son(father, mother): def study(self): print("son.study") obj = son() obj.computer() #aunt.computer
其执行的顺序如下图:
红线是往上继承,黑线是代码执行的流程
还是跟(1)(2)差不多,但是不一样的是,在左侧一直未找到所调用的方法时,并没有有一直找到底,而是在最后一个父类前回到son子类,开始在mother类中寻找,最后才指向aunt类并找到其computer()方法
((3)总结:如果有共同父类,则在寻找方法时,不会一直寻到底,而是在寻到底之前的父类换到最原始给的父类中去寻找,如果都找不到才会找寻到底父类)怎么好理解就怎么去记忆
(下面代码修改了一些)
class uncle: def video(self): print("uncle.video") class father(uncle): def work(self): print("father.work") self.car() def car(self): print("father.car") class mother: def car(self): print("mother.car") class son(mother,father): def study(self): print("son.study") obj = son() obj.work() #father.work #mother.car
对象在去父类找寻方法时,由于mother类没有其方法,在father类下找到并执行后,方法内还有self.car(),按道理来说应该是同一类下有该方法就优先执行,但是结果却是mother.car,其原因很简单,当碰到self.方法()时,就应该返回到其对象(self所指向的对象,此代码是obj)所调用的类中再去执行其方法的调用(对于上述代码,就是再次调用obj.car(),然后先从方法的子类中寻找,再向其父类中找寻方法,第一个父类时mother,在mother类中有car()方法,所以就直接调用执行了,over!)
1 class uncle: 2 def __init__(self): 3 print("uncle.init") 4 def video(self): 5 print("uncle.video") 6 class father(uncle): 7 def __init__(self): 8 print("father.init") 9 def work(self): 10 print("father.work") 11 class mother: 12 def car(self): 13 print("mother.car") 14 15 class son(father,mother): 16 def study(self): 17 print("son.study") 18 obj = son() #father.init
(上述代码father类还继承了一个父类,它们同时有__init__方法,但是先遍历到子类father,所以就先调用其类下的init方法,每当执行其类的对象时,只会执行一次最先遇到的__init__的方法)
来源:https://www.cnblogs.com/renio/p/12370151.html