暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python | 面向对象编程进阶OOP特征:继承与多态

西安川石 2022-03-31
239


每天一个测试技术

只需几分钟

川石信息 带你学点更好的




川石信息|腾讯课堂

免费试学 | 自动化测试



1

继承 extends


• 继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。


• 猫可以:喵喵叫、吃、喝、拉、撒

• 狗可以:汪汪叫、吃、喝、拉、撒


例如:


• 我们发现无论是猫还是狗,都有共同的行为,同时也有自己个性的行为叫。



(一)继承的语法


• 父类-子类的纵向编程模式。



▲ 注意,在继承关系下,子类将会拥有父类全部的方法(即,父类方法可在子类对象中访问调用)


示例:


    ch10-demo07 -extends.py

    左右拉动查看完整代码


    • UML,类图设计,Cat类和Dog类继承于Animal动物类。



    说明:通过类图我们可以看出


    • Animal类有eat(吃)、drink(喝)、 shit(拉)、pee(撒)四个公共方法。


    • Cat和Dog类在继承了父类Animal的同时, 又有各自自己的Call方法。


    因此,我们可以得出一个结论:一般共有的方法可以抽象出来放在父类中,子类在继承父类的同时凸显出自己个性的方法。


    示例:


      ch10-demo07-extends.py

      左右拉动查看完整代码


      • 创建Animal父类,与其子类:Cat



      此处省略 Dog 类代码(与Cat类类似)……



      (二)多重继承


      Q: 那么问题又来了,多继承呢?


      ① 是否可以继承多个类?

      ② 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?


      答:


      ① Python的类可以继承多个类,不像很多高级编程语言Java和C#那样只能继承一个类(单根语系)。

      ② 类如果继承了多个类,那么其对象调用寻找方法的方式是:广度优先


      示例5:


        ch10-demo08-extends-methods.py


          class A():
          def f(self):
          print('A')
          class B():
          def f(self):
          print('B')
          class C(A,B):
          pass
          s = C()
          s.f() # A


            ......
            class C(A,B):
            pass
            class D(A,B):
            def f(self):
            print("D")
            class E(C,D):
            pass
            s = E()
            s.f() # D

            左右拉动查看完整代码



            (三)继承下的super()概述


            • 在Python面向对象的继承特征下,若子类中需调用父类的方法,则需要使用super()来实现。


            示例:


              ch9-demo07-example-inherit.py

              左右拉动查看完整代码




              (四)当super遇到_init_


              • 我们以一个房屋作为示例。


              示例:


                ch9-demo08-example-inherit.py

                左右拉动查看完整代码




                2

                多态


                • Python不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。


                Q:什么是“鸭子类型”?


                • 鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:


                示例:


                  demo08.py

                  左右拉动查看完整代码



                  • 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类


                  • 而实际传入的参数是:S1对象和S2对象





                  ⭐川石信息 春季特惠⭐


                  线上提升班,火热活动中,最高优惠直降1000+

                  涨薪必备:高级性能测试+自动化测试开发,一线企业offer挑到手软!

                  报名还送 jmeter python redis 三门免费课程包!

                  名额有限,扫一扫下方图片二维码速度联系我预约报名!

                  😎来川石,更优质的就业机会等着你。



                  今天的内容就学习到这里了,每个工作日小编都会更新一个有关测试的小知识,希望大家多多关注我们,一起来学习喔!


                  温馨提示:添加老师微信【13691729932】可以获取全套软件测试自学资料!



                   往期回顾 


                  面向对象编程进阶OOP特征:封装



                  大神邀你加入

                  软件测试群

                  免费软件测试课

                  川石课堂



                  文章转载自西安川石,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论