Day 23 面向对象进阶
目录
- 面向对象进阶
- 类的继承
- 什么是继承
- 为什么要用继承
- 对象的继承
- 对象查找属性的顺序
- 类的派生
- 类的组合
- 菱形继承问题
- 类的分类
- 菱形继承问题
- 多态与多态性
- 多态
- 多态性
- 类的继承
面向对象进阶
类的继承
什么是继承
- 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
- 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')
菱形继承问题
类的分类
- 新式类
- 继承了object的类以及该类的子类,都是新式类
- python3中所有的类都是新式类
- 经典类
- 没有继承object的类以及该类的子类,都是经典类
- 只有python2中才有经典类
菱形继承问题
如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找有两种:
- 经典类:深度优先:一条路走到底.先从子类的第一个父类开始查找,直到这个子类继承的最后一个父类,如果没有找到就从子类的第二个父类开始查找(但不会找到最后一个父类),然后是子类的第三个父类,第四个父类,直到找到需要的属性
- 新式类:广度优先:不直接找最后一个继承的父类,先从子类的子一个父类开始找,跳过继承的最后一个父类,然后子类的第二个父类,第三个,直到最后一个父类然后再去查找他们继承的最后一个父类
普通继承就是按照正常循序查找
多态与多态性
多态
多态指的是一类事物有多种形态(一个抽象类有多个子类,因而多态的概念依赖于继承)
多态性
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用给一个函数名调用不同内容的函数
转载于:https://www.cnblogs.com/masterjian924/p/11056499.html
Day 23 面向对象进阶相关推荐
- Python之面向对象进阶
Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...
- 第十二课 Java基础篇——面向对象进阶(一)
一.Static static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量 静态变量是随着类的加载而加载的,优先于对象出现的 练习1.定义数组工具类 需求:在实际开发中,经常会遇到一 ...
- Java面向对象进阶
相关额外的代码待上传... /*** 面向对象进阶*/ package com.org.lxh;import com.org.lxh.ext.Demo; import com.org.lxh.impl ...
- JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
第2节 面向对象进阶 一.封装与private 概述: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.保护成员属性,不让类以外的程序直接访问和修改. 封装原则: 隐藏对象的属性和实现细节,仅 ...
- python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...
Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...
- 第四十三篇 面向对象进阶2
目录 第四十三篇 面向对象进阶2 一.类的封装 1.封装分为两个层面 2.应用 二.类的property特性 1. BMI(Body Mass Index):身体体质指数 2.装饰器用法(只在Pyth ...
- Java大数据-Week2-Day2面向对象进阶
第二章第三节 面向对象进阶 文章目录 第二章第三节 面向对象进阶 前言 封装 this关键字 静态static 包 包2 权限修饰符 代码块 main方法详解 总结 前言 # 第三章第3节 面向对象进 ...
- python进阶课程目标 学习内容_Python学习教程(Python学习路线):第九天-面向对象进阶...
面向对象进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息.为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程 ...
最新文章
- python计算机_基础python计算机知识
- 怀旧服湖畔镇服务器位置,《魔兽世界怀旧服》今天再开10组新服 47组服务器免费转服开启...
- DDoS高安全性ip服务:解决各种DDoS攻击问题
- [BZOJ 2839] 集合计数
- 你真的知道怎么实现一个延迟队列吗 ?
- CMSIS-DAP和J-Link、ST-Link是什么关系?
- C#强力粉碎文件代码分享,升级中用到
- Apache 目录结构与配置指令
- 安装mysql程序运行出错_如何解决mysql安装后.net程序运行出错的问题
- 快速学习Linux-网络管理
- java格式化日期24小时_Java如何格式化24小时格式的时间?
- 计算机财会属于经济管理类吗,哪些专业可以考公务员
- IIC详解之AT24C08
- poj 1129 Channel Allocation——四色定理
- OpenStack修改Guest用户密码——利用Qemu guest agent实现
- 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
- 数据圈最全的数据分析产品文章合集
- 基于web的教学答疑系统
- rfid android软件,RFID Tools
- Linux C++服务器项目——网络编程2(三次握手、四次挥手、IO多路复用)