zoukankan      html  css  js  c++  java
  • 【 python 学习笔记 -- OOP】在实例中学习继承(inheritance)和组合(composition)

    【面向对象的三大特征】:

      【封装(encapsulation)】: 通过抽象的类把数据和方法封装起来。实例的数据只能通过public interface(即实例的方法)来获取或操作。

              【优点】:1. 功能只需在一个地方定义,而不需要在很多地方重复定义

                   2. 保证对象内部的数据的安全性

                   3. 当我们想要使用一个方法的时候,我们只需要知道我们用这个方法会返回什么结果,而不需要知道内部到底做了哪些操作来实现的。

                     就好像我们看电视时想要换频道,只需要按几个按钮,不需要知道要怎么调频。 

      【继承  (inheritance)】 : 简单理解,比如我们建了一个类(class),我们先称之为父类(super class);

                 然后我们想建立几个其他的类,这些类中想要用到一些类似于父类中的特性,比如父类中的attributes和methods;

                 那么我们可以通过继承的方式实现, 这些类我们可以称之为子类(sub class)。

                 子类可以继承父类的所有属性和方法

                 当查询一个属性时,顺序是:实例,类,父类, 父类的父类...

        【多重继承】:一个子类可以继承多个父类,这时涉及到属性查询顺序的问题:

               在python中查询采用dfs算法,但是当出现重复的对象时,会在查询顺序列表中将前面出现过的对象删掉。

               我们可以通过使用cls.mro()来查询一个class的MRO(method resolution order)。(cls 换成任意想要查询mro的类名)

             例子:(1) class D 的父类是 class B 和 C, 我们表示为class D(B,C); B的父类是A 即 class B(A)。

                那么D.mro()是D-B-A-C,即当我们执行D实例时,首先在D中查询,然后是B,然后A,然后C。

                (2)当有不止一个父类继承了同一个类时,为了防止歧义, 当有重复的类出现在MRO中,在mro中将前一个重复的类去掉:  

                  例如:class D(B,C),  class B(A) , class C(A): , 则D 的MRO是: D-B-C-A

                  dfs步骤如下: [D]-->[D,B]-->[D,B,A]-->[D,B,A,C]-->(C的父类是A,在前面已经出现了,把前面的A去掉)-->[D,B,C,A]

      【多态  (polymorphism)】: 简单理解,不同的几个类有相同的方法名(method name),即有相同的interface,我们可以在任何一个类的实例调用相同的方法名。

                  但实际上,虽然这些方法名字相同,概念上相似,内部操作是不同的。

          【组合 (composition)】: 几个不同的类可以组合起来工作,但是彼此之间没有依赖性(decoupling);这是它区别于继承的一点。

                    -->更加保证了代码的可维护性。

    【实例】:利用继承或者组合的方式创建三个类: WriteFile(), TXTFile(), CSVFile()实现写入文件操作。其中,TXTFile()将日期时间和一串信息写入txt文件,CSVFile用","将不同的值隔开再输入。

      第一种: 通过继承的方式实现

      

      结果:

         text1.txt中为:

         

        text1.csv中为:

        

      第二种: 通过组合的方式实现

       

      结果:

        text2.txt中为:

        

        text2.csv中为:

        

    【参考课程】https://www.udemy.com/python-beyond-the-basics-object-oriented-programming/learn/v4/overview

  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/jade-91/p/8350042.html
Copyright © 2011-2022 走看看