目录

  • 面向对象进阶

    • 类的继承

      • 什么是继承
      • 为什么要用继承
      • 对象的继承
      • 对象查找属性的顺序
    • 类的派生
    • 类的组合
    • 菱形继承问题
      • 类的分类
      • 菱形继承问题
    • 多态与多态性
      • 多态
      • 多态性

面向对象进阶

类的继承

什么是继承

  • 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
  • python当中,父类,子类(派生类),父类和子类只有在继承的时候才会产生
  • 继承是为了获取父类的属性

为什么要用继承

  • 集成可以减少代码冗余

对象的继承

  • python中支持一个子类继承多个父类,但是不推荐使用继承多个父类,当你继承多个的时候,功能与功能之间就会混乱,所以建议继承一个
  • python3中如果一个类没有继承任何类,那么默认继承object类
  • python2中如果一个类没有继承任何类,不会继承object类

对象查找属性的顺序

先对象自己,后然后对象的类,然后父类,在父类,知道object类

类的派生

派生就是子类定义新的属性,同时还继承父类的所有属性

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

class Animal():def __init__(self, height, weight):  self.height = height  self.weight = weight  def jiao(self):print(self.__class__.__name__, '叫')class People(Animal):def __init__(self, name, age,height,weight):Animal.__init__(self,height,weight)self.name = nameself.age = agedef read(self):print('read')p1=People('nick',18,180.140)
print(p1.__dict__)

方法二:派生

  • 严格以继承属性查找关系
  • super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
  • super的完整用法是super(自己的类名,self),在python2中需要完整写明,二python3中可以简写为super()
class OldBoyPeople:school='oldboy'def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexclass OldBoyStudent(OldBoyPeople):def __init__(self,name,age,sex,stu_id):super().__init__(name,age,sex)self.stu_id=stu_iddef choose_course(self):print(f'{self.name} is choosing course')stu1=OldBoyStudent('nick',19,'male','001')

类的组合

组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象

组合就是用来解决类与类之间代码冗余的问题

class People:def __init__(self,name,sex):self.name=nameself.sex=sexdef eat(self):print(f'{self.name}开始吃')class Student(People):def __init__(self,id,name,sex):super(Student, self).__init__(name,sex)self.id=iddef choose_course(self,course):self.course=course      #相当于student派生一个course属性,该属性引用外部传入的course也就是Course生成的对象print(f'{self.name}选择了课程{course.name}')class Teacher(People):def __init__(self,level,name,sex):super(Teacher, self).__init__(name,sex)self.level=leveldef scored(self,student,course,score):print(f'{self.name}给学生{student.name}的课程{course.name}打{score}分')class Admin(People):def create_course(self,name,price):course=Course(name,price)print(f'管理员{self.name}创建了课程{name}')return courseclass Course:def __init__(self,name,price):self.name=nameself.price=pricest1=Student('01','zhujian','male')
st2=Student('02','tom','male')
print(st1.__dict__)
print(st2.__dict__)t1=Teacher('1','nick','male')
print(t1.__dict__)a1=Admin('egon','male')
print(a1.__dict__)linux=a1.create_course('linux',6666)
python=a1.create_course('python',8888)st1.choose_course(python)
st2.choose_course(linux)t1.scored(st1,python,'96')
t1.scored(st2,linux,'95')

菱形继承问题

类的分类

  1. 新式类
  • 继承了object的类以及该类的子类,都是新式类
  • python3中所有的类都是新式类
  1. 经典类
  • 没有继承object的类以及该类的子类,都是经典类
  • 只有python2中才有经典类

菱形继承问题

如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找有两种:

  • 经典类:深度优先:一条路走到底.先从子类的第一个父类开始查找,直到这个子类继承的最后一个父类,如果没有找到就从子类的第二个父类开始查找(但不会找到最后一个父类),然后是子类的第三个父类,第四个父类,直到找到需要的属性
  • 新式类:广度优先:不直接找最后一个继承的父类,先从子类的子一个父类开始找,跳过继承的最后一个父类,然后子类的第二个父类,第三个,直到最后一个父类然后再去查找他们继承的最后一个父类

普通继承就是按照正常循序查找

多态与多态性

多态

多态指的是一类事物有多种形态(一个抽象类有多个子类,因而多态的概念依赖于继承)

多态性

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用给一个函数名调用不同内容的函数

转载于:https://www.cnblogs.com/masterjian924/p/11056499.html

Day 23 面向对象进阶相关推荐

  1. Python之面向对象进阶

    Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...

  2. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  3. 第十二课 Java基础篇——面向对象进阶(一)

    一.Static static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量 静态变量是随着类的加载而加载的,优先于对象出现的 练习1.定义数组工具类 需求:在实际开发中,经常会遇到一 ...

  4. Java面向对象进阶

    相关额外的代码待上传... /*** 面向对象进阶*/ package com.org.lxh;import com.org.lxh.ext.Demo; import com.org.lxh.impl ...

  5. JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

    第2节 面向对象进阶 一.封装与private 概述: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.保护成员属性,不让类以外的程序直接访问和修改. 封装原则: 隐藏对象的属性和实现细节,仅 ...

  6. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

    Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...

  7. 第四十三篇 面向对象进阶2

    目录 第四十三篇 面向对象进阶2 一.类的封装 1.封装分为两个层面 2.应用 二.类的property特性 1. BMI(Body Mass Index):身体体质指数 2.装饰器用法(只在Pyth ...

  8. Java大数据-Week2-Day2面向对象进阶

    第二章第三节 面向对象进阶 文章目录 第二章第三节 面向对象进阶 前言 封装 this关键字 静态static 包 包2 权限修饰符 代码块 main方法详解 总结 前言 # 第三章第3节 面向对象进 ...

  9. python进阶课程目标 学习内容_Python学习教程(Python学习路线):第九天-面向对象进阶...

    面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息.为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程 ...

最新文章

  1. python计算机_基础python计算机知识
  2. 怀旧服湖畔镇服务器位置,《魔兽世界怀旧服》今天再开10组新服 47组服务器免费转服开启...
  3. DDoS高安全性ip服务:解决各种DDoS攻击问题
  4. [BZOJ 2839] 集合计数
  5. 你真的知道怎么实现一个延迟队列吗 ?
  6. CMSIS-DAP和J-Link、ST-Link是什么关系?
  7. C#强力粉碎文件代码分享,升级中用到
  8. Apache 目录结构与配置指令
  9. 安装mysql程序运行出错_如何解决mysql安装后.net程序运行出错的问题
  10. 快速学习Linux-网络管理
  11. java格式化日期24小时_Java如何格式化24小时格式的时间?
  12. 计算机财会属于经济管理类吗,哪些专业可以考公务员
  13. IIC详解之AT24C08
  14. poj 1129 Channel Allocation——四色定理
  15. OpenStack修改Guest用户密码——利用Qemu guest agent实现
  16. 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
  17. 数据圈最全的数据分析产品文章合集
  18. 基于web的教学答疑系统
  19. rfid android软件,RFID Tools
  20. Linux C++服务器项目——网络编程2(三次握手、四次挥手、IO多路复用)

热门文章

  1. CloudStack无法添加模板和iso
  2. JavaScript全局函数
  3. JS入门之arguments对象
  4. 【boundfield】GridView中BoundField与TemplateField的区别_boundfield
  5. Android 内存溢出解决方案(OOM) 整理总结
  6. 联想利泰的一道做出来就给月薪7K的面试题--交通灯管理系统
  7. 贪心算法--多处最优服务次序问题
  8. 口语学习Day4:今天带你们一起逛一下博物馆
  9. 简述进程的启动、终止的方式以及如何进行进程的查看。
  10. [译]理解js中的event loop