面向对象
面向过程的使用场景:一些对扩展性要求不高的程序系统内核,shell脚本
面向对象的使用场景:常见的web开发 爬虫开发 数据分析等 对扩展性要求比较高
类和对象
对象是什么? 特征和技能的结合体 (万物皆对象)
类是什么? 一系列具备相同特征和技能的对象的 抽象概念
现实生活中 先有对象再有类
程序中 先有类 再有对象
使用OOP来编写程序时1.首先思考完成任务需要哪些对象参与2.在思考这些对象有什么要的特征和技能3.编写class4.按照需求 添加特征和行为5.实例化对象6.使用对象完成任务
三大特征
封装
什么意思? 将内部复杂内容进行隐藏 只提供一个简单的使用接口
本质上就是影藏一部分内容 使外界无法直接访问 只能通过提供的接口来访问
为什么要封装
对于开发者 作用对数据的访问加以限制 提高安全性
对于使用者而言 简化了操作
如何封装
属性前签上__两个下划线
pwd= 123
__pwd = 123
__的本质是语法级别上变形(在语法检测期间) _类名__属性名
这么一来 我么完全可以绕过语法限制
继承1.什么是继承
继承与现实生活中的继承一个意思 例如 小明继承小明他爹财产 房子
一个东西b继承了另一个东西a b就拥有a的内容
在代码中
一个类b继承了另一个类a b这个类 就拥有了a中所有属性
作用:
可以减少代码冗余2.使用场景:
例如: 你的项目中需要两种对象 老师和学生
分析发现 老师和学生有很多相似之处 都有 姓名 性别 年龄
将相同的部分属性 抽取到一个共同父类中person3.写法:classPerson:
共有的属性
name
age
genderdefsleep():print(大家都需要睡觉 睡觉的过程也相同)defattendClass():print("听到上课铃声 要去教室")4.派生:
分析:
学生和老师 有相同的功能叫上课
然而上课这个操作 学生和老师只有部分相同
可以把相同的部分 抽取到父类中
这样一来 学生就可以直接拥有父类中的上课方法 但是 实现方式与父类中有所不同
此时我们可以直接覆盖父类中的函数 这样一来 学生类称之为person类的派生类
总结:
结合上课讲到的属性的派生,总的来说 只要子类中东西和父类不同 就成为派生类
派生的案例:
继承自PersonclassStudent(Person):
学号(子类特有的)#上课
defattendClass():
super().attendClass()print("听课")
继承自PersonclassTeacher(Person):
工资(子类特有的)defattendClass():
super().attendClass()print("讲课")5.super 是创建了一个特殊对象,专门用于访问父类提供的属性classPerson:def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=genderclassStudent(Person):#学生有学号
def __init__(self,name,age,gender,number):#1.指名道姓找到父类的函数
Person.__init__(self,name,age,gender)#2.创建特殊对象调用
super().__init__(name,age,gender)
self.number=number6.单继承和的多继承7.多继承中的查找顺序 mro
python2中 需要手动指定Object作为父类 它就成为了新式类
python3中 默认就继承Object 不需要手写
多态
组合
装饰器:
property
classmethod
staticmethod
类内置方法__str__打印对象时返回的字符串__del__删除对象前执行 一些清理操作
反射
以字符串的方式 对对象中的属性进增删改查