• 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
  • 相关阅读:
    html不点击提交,自动post
    wpf slider刻度
    visual studio 的 code snippet(代码片段)
    更换手机号之前
    post提交
    动态修改settings
    获取文件数据流+叠加byte数组(给byte数组加包头包尾)
    装箱与拆箱
    ue4中窗口打开web地址
    C++通过Callback向C#传递数据,注意问题
  • 原文地址:https://www.cnblogs.com/112358nizhipeng/p/9818054.html
Copyright © 2020-2023  润新知