学习python课程第二十二天

一 .   类的继承与派生 :

  1. 什么是继承:

    在程序中继承是一种新建子类的方式, 新创建的类称之为子类,或者派生类.

    被继承的类称之为父类,

    继承描述的是一种遗传关系, 子类可以重用父类的属性.

  2. 为何要用继承 :

    继承可以减少类与类之间代码冗余的问题.

  3. 如何继承 :

    先抽象,再继承

    抽象 :抽取出比较像的部分.. 最主要的作用是划分类别 (可以隔离关注点, 降低复杂度.)

    继承 :是基于抽象的结果,通过编程语言去实现它. 肯定是先经历抽象这个过程,才能通过继承的方式去表示

    出抽象的结构

    抽象只是分析和设计的过程中,一个动作或者说一个技巧. 可以通过抽象来得到类.

  示例 :

    #  在python中继承的特点 : 有单继承 和 多继承

 

    class Parent1:

      pass

    class Parent2:

      pass

    class Sub1(Parent1):

      pass

    class Sub2(Parent1,Parent2):

      pass

  print(Sub1.__bases__)  # 查看它的基础,基本

  print(Sub2.__bases__)

      

  python2 与 python3中,继承上的区别:

  新式类 : 但凡继承object类的子类, 以及该子类的子子类...都称之为新式类.

  

  经典类 : 没有继承object类的子类, 以及该子类的子子类...都称之为经典类.

  

  只有在python2中才区分新式类与经典类.  (在python中也写上object,这个程序也可以在python2中兼容)

  

  4. 基于继承解决类与类代码冗余的问题 :

   在子类派生出的新功能中,如何重用父类的功能:

   方式一:    指名道姓的访问某一个类中的函数,与继承无关,

    class OldboyPeople:      # 存放两个类似的相同属性.  (父类)

      school = ‘Oldboy‘

      def  __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.gender = gender

    

    class OldboyStudent(OldboyPeople)     # 学生的类

      def  choose_course(self):

        print(‘%s  正在选课‘ %self.name)

    class  OldboyTeacher(OldboyPeople):

      def  __init__(self,name,age,gender,level.salary):

        OldboyPeople.__init__(slef,name,age,gender)  #  指名道姓的找到父类里相同的属性

        self.level = level

        self.salary = salary

      def  score(self,stu,num):

        stu.num = num

        print(‘老师%s给学生%s打分%s‘ %(self,name,stu.name,num))

    

  5.  在单继承的背景下属性的查找:

    在单继承背景下, 无论是新式类,还是经典类, 属性查找顺序都一样.

    顺序:    先 obj ---> 类 ---> 父类 --->......

    class   Foo:

      def f1(self):

        print(‘Foo 1‘)

      def f2(self):

        print(‘Foo  2‘)

        self.f1()    #obj.f1()

    class Bar(Foo):

      def  f1(self):

        print(‘Bar  f1‘)  # 打印这个结果

  obj = Bar()

  obj.f2()

  

  6. 在多继承背景下, 如果一个子类继承了多个分支,但是多个分支没有汇聚到一个非object类.

    无论新式类和经典类查找顺序都一样 :

    顺序:   会按照从左到右的顺序一个分支一个分支的查找下去

      A -->B-->E-->C-->F--D  最后在找object

    class  F:

     pass

    class  E:

     pass

    class  B(E):

     pass

    class  C(F):

     pass

    class  D:

     pass

    class  A(B,C,D):

     pass

  在多个继承背景下, 如果一个子类继承了多个分支,但是多个分支最终汇聚到一个非object类 (菱形继承问题)

    

  新式类的查找方式 : 广度优先查找  obj-->A-->B-->E-->C-->F-->D-->G-->object

  经典类的查找方式 : 深度优先查找  obj-->A-->B-->E-->G-->C-->F-->D

  

   这个查找顺序都是基于C3算法得来的结果,

  C3 算法在python3里有一个内置的方法,xx . mro() 在mro列表中存放着C3算法的结果, 它是在定义类的时候就

  开始计算了.

  不管是单继承还是多继承或者是菱形继承, 都是按照C3算法的mro里的结果列表的顺序来查找.

  

  

  

  

  7. 用super方法来重用父类的功能.

  

  super(OldboyTeacher). 在python3中super可以不传参数,调用该函数会得到一个特殊的对象,该对象是专门用来

    访问父类中的属性.

  强调 : super会严格参照当前类的mro列表依次查找属性.

  # 在子类派生出的新功能中, 如何重用父类的功能:

    方式2 :

    

    class OldboyPeople:

      school = ‘oldboy‘

      def __init__(self,name,age,gender):

        self.name = name

        self.age = age

        self.gender = gender

      

    class OldboyTeacher(OldboyPeople):

      def  __init__(self,name,age,gender,level,salary):

        super(OldboyTeacher,self).__init__(name,age,gender)    #super本身不用传参数

        self.level = level

        self.salary = salary

  注意 :  两种方式都可以用,但是最好不要两种方式混着用.

  

  总结 : 一般在搭建框架的时候才用到多继承, 继承这个方式以后能不用就不用, 好处确实是能减少代码冗余,

  但是它把子类和父类的耦合加大. 程序的可读性变差.   继承可以用,但是一般在单继承的场景下再用.

    

原文地址:https://www.cnblogs.com/lvyipin1/p/9838005.html

时间: 2024-10-30 13:34:21

学习python课程第二十二天的相关文章

学习python课程第二十三天

一.    组合 : 1. 什么是组合 ? 一个对象的属性是来自于另外一个类的对象, 称之为组合. (跟继承其实很相似.都是共用一个类里面的属性) 2. 为何用组合 ? 组合也是用来解决类与类代码冗余的问题. 3. 如何用组合 ? class Foo: aaa=1111 def __init__(self,x,y): self.x=x self.y=y def func1(self): print('Foo内的功能') class Bar: bbb=2222 def __init__(self,

学习python课程第十二天

一. 装饰器: 1 什么是装饰器 器=>工具 装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=>函数 被装饰的对象也可以是任意可调用的对象=>函数 目标:写一个函数来为另外一个函数添加新功能 2 为何要用装饰器 开放封闭原则: 软件一旦上线就应该对修改封闭,对扩展开放 对修改封闭: 1. 不能修改功能的源代码 2. 也不能修改功能的调用方式 对扩展开发: 可以为原有的功能添加新的功能 装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能

Linux课程第二十二天学习笔记

####################空壳邮件####################[[email protected] ~]# vim /etc/named.rfc1912.zones ----------------------------------------------- 37 zone "westos.org" IN { 38         type master; 39         file "westos.org.zone"; 40    

学习python课程第十九天

一.   各种序列化模块 一.  pickle 模块 pickle是一个用来序列化的模块 序列化是什么? 指的是将内存中的数据结构转化为一种中间格式, 并储存到硬盘上, 反序列化? 将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化? 就是为了将数据持久储存 之前学过的文件也能完成持久化存储, 但是操作起来非常麻烦 pickle模块的主要功能 dump   load   dumps   loads dump 是序列化.  load是反序列化 不带s的是帮你封装好 write 和

python课程第二周 内置数据结构——列表和元组

5种内置数据结构:列表.元组.字典.集合.字符串.列表.字典.字符串三种被称为线性结构. 针对线性结构的操作有:切片.封包和解包.成员运算符.迭代. 针对数据结构的操作有解析式:解析式分为列表解析.生成器解析.集合解析和字典解析. 后面三种是Python3.x特有的. 基本框架如下: 一.列表:Python中最具灵活性的有序集合对象类型 列表可包含任何种类的对象:数字.字符串.字典.集合甚至其他列表,这个特性称为异构.还具有可变长度和任意嵌套的特性,属于可变长度序列. (1)列表的初始化,有两种

【如何学习Python课程】

一.学习流程方法 1,学习流程方法. 按照视频流程走. 视频稍微有点基础,视频加快速度. 熟悉的同学. 记笔记的形式多 做作业遇到问题记下来,画流程图再写. 二.如何使你的python提高更快 2,如何使你的python提高更快. 调整听说读写顺序. 听.写.读.说 听:加速听 写:1,画流程图:2,写好代码的框架(最小可用原则,调试debug(往产品方向打造): 读:读别人代码和书.先定个小目标(读不下去也得读) 说:给别人讲一遍. 课余练习 1,有意识的和有目的进行练习掌握核心技能. 2,练

开始学习python的第二天

一.练习题 1.使用while循环输入 1 2 3 4 5 6 8 9 10 #第一种方法 count = 0 while count < 10: count += 1 # count = count + 1 if count == 7: print(' ') else: print(count) #第二种 count = 0 while count < 10: count += 1 # count = count + 1 if count == 7: continue print(count

【Objective-C学习记录】第二十二天

不可变字符串操作: 1.initWithFormat:.初始化操作,其中直接赋值的效果与该方法一样,例如: 1 NSString *string1 = [[NSString alloc] initWithFormat:@"iOS"]; 2 NSString *string2 = @"iOS"; 但需要注意的是,第二种方法声明的是常量字符串,位于内存里的常量区. 2.length.获取字符串长度,length的定义是 1 @property (readonly) NS

学习python课程第八天

一.文件操作: 1: 基本概念打开文件的模式有三种纯净模式:r(默认的) w a 控制操作文件内容格式的两种模式:t(默认的) b大前提: tb模式均不能单独使用,必须与纯净模式结合使用t文本模式: 1. 读写文件都是以字符串为单位的 2. 只能针对文本文件 3. 必须指定encoding参数b二进制模式: 1.读写文件都是以bytes/二进制为单位的 2. 可以针对所有文件 3. 一定不能指定encoding参数 2. 打开文件模式详解1. r只读模式: 在文件不存在时则报错,文件存在文件内指