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
原文地址:https://www.cnblogs.com/112358nizhipeng/p/9818054.html