Python面向对象(继承)
day24
面向对象三大特性:继承
1 class F: 2 def f1(self): 3 print("F.f1") 4 5 def f2(self): 6 print("F.f2") 7 8 class S(F):#子类继承父类 9 def s1(self): 10 print("S.s1") 11 12 obj = S() 13 14 obj.s1() 15 obj.f1()#继承了父类的方法
子类对象继承了父类的方法。
执行结果:
S.s1
F.f1
Process finished with exit code 0
覆盖父类中的方法
1 class F: 2 def f1(self): 3 print("F.f1") 4 5 def f2(self): 6 print("F.f2") 7 8 class S(F): 9 def s1(self): 10 print("S.s1") 11 12 def f2(self):#覆盖掉父类的方法f2 13 print("S.f2") 14 15 obj = S() 16 17 obj.f1()#继承了父类的方法 18 19 obj.f2()#继承了父类的方法,但是子类中有相同的方法则使用子类的方法 20 21 print("############################################################################################") 22 23 dui = S() 24 dui.s1() #s1中self是形参,指代dui 25 dui.f1()#其中self指代dui,即调用方法的对象
子类中有与父类相同的方法则使用子类自己的方法。
执行结果:
F.f1 S.f2 ############################################################################################ S.s1 F.f1 Process finished with exit code 0
super:父类和子类相同的方法都执行
1 class F: 2 def f1(self): 3 print("F.f1") 4 5 def f2(self): 6 print("F.f2") 7 8 class S(F): 9 def s1(self): 10 print("S.s1") 11 12 def f2(self):#覆盖掉父类的方法f2 13 super(S, self).f2()#当前类名、self 执行父类的f2方法 14 print("S.f2") 15 F.f2(self)#执行父类的f2方法 16 17 obj = S() 18 obj.f2()
13行和15行的结果一样,推荐使用super方法。
执行结果:
F.f2
S.f2
F.f2
Process finished with exit code 0
多继承
1 class F1: 2 def a(self): 3 print("F1.a") 4 5 class F2: 6 def a(self): 7 print("F2.a") 8 9 class S(F1, F2):#优先从左找 10 pass 11 12 obj = S() 13 obj.a()
优先从左边父类找方法。
执行结果:
F1.a
Process finished with exit code 0
父类为子类
1 class F0: 2 def a(self): 3 print("F0.a") 4 5 class F1(F0): 6 def b(self): 7 print("F1.b") 8 9 class F2: 10 def a(self): 11 print("F2.a") 12 13 class S(F1, F2):#优先从左找 14 pass 15 16 obj = S() 17 obj.a()
从左边找对应的方法,找到的第一个作为对象的方法。
执行结果:
F0.a
Process finished with exit code 0
有共同父类
1 class Base(): 2 def a(self): 3 print("Base.a") 4 5 class F0(Base): 6 def b(self): 7 print("F0.b") 8 9 class F1(F0): 10 def c(self): 11 print("F1.c") 12 13 class F2(Base): 14 def a(self): 15 print("F2.a") 16 17 class S(F1, F2):#优先从左找 18 pass 19 20 obj = S() 21 obj.a()
有共同父类,父类方法最后考虑。(并不是左边一条路走到黑,直到共同父类。)
执行结果:
F2.a
Process finished with exit code 0
1 class BaseReuqest: 2 pass 3 4 5 class RequestHandler(BaseReuqest): 6 def serve_forever(self): 7 # self,是obj 8 print('RequestHandler.serve_forever') 9 self.process_request() 10 11 def process_request(self): 12 print('RequestHandler.process_request') 13 14 class Minx: 15 16 def process_request(self): 17 print('minx.process_request') 18 19 class Son(Minx, RequestHandler): 20 pass 21 22 23 obj = Son() # init 24 obj.serve_forever()
其中第9行的self还是指obj对象,所以process_request方法必须先从Minx类中开始找。
执行结果:
RequestHandler.serve_forever
minx.process_request
Process finished with exit code 0
执行流程
1 class BaseReuqest: 2 3 def __init__(self): 4 print('BaseReuqest.init') 5 6 7 class RequestHandler(BaseReuqest): 8 def __init__(self): 9 print('RequestHandler.init') 10 BaseReuqest.__init__(self) 11 12 def serve_forever(self): 13 # self,是obj 14 print('RequestHandler.serve_forever') 15 self.process_request() 16 17 def process_request(self): 18 print('RequestHandler.process_request') 19 20 class Minx: 21 22 def process_request(self): 23 print('minx.process_request') 24 25 26 class Son(Minx, RequestHandler): 27 pass 28 29 30 obj = Son() # init 31 obj.serve_forever()
第30行,创建对象时先执行__init__。
执行结果:
RequestHandler.init
BaseReuqest.init
RequestHandler.serve_forever
minx.process_request
Process finished with exit code 0