1.面先过程编程:
核心是过程二字,过程指的是解决的步骤,即先干什么、在干什么、最后干什么。基于该思想写程序就是在设计一条条流水线。
优点:复杂的问题流程化、进而简单化
缺点:牵一发而动全身
2.面向对象编程
核心是’对象’,对象指的是盛放相关的数据与功能的容器
基于该思想编写的程序就在创造一个个的容器来把相关的东西盛到一起
优点:扩展性强
缺点:加大了编程的复杂度
3.类
类是用来解决对象之间代码冗余问题
类定义阶段发生的三件事:
1.会执行类体的代码。
2.会产生类的名称空间,用来将类体代码运行过程中产生的名字都丢进去。
3.将名称空间的内存地址绑定给类名。
调用类发生的三件事:
1.创建空对象(调用__new__方法来创建空对象)。
2.会自动触发类中__init__函数的运行,(空对象, ‘egon’,18,‘male’)。
3.返回该对象,赋值给变量。注意:__init__不能设置其他返回值,只能返回None。
类中两种属性:
1.数据属性
2.函数属性
但是类中的属性是为对象准备的
1.类的属性是直接共享给所有对象的
2.类的函数属性是绑定对象使用的
封装(整合)
是面向对象三大特性最核心的一个。
1.将封装的属性进行隐藏操作
__开头的属性隐藏有四个特点:
1.不是真的隐藏,只是一种语法上的变形 _类名__属性
2.该隐藏只是在类定义阶段发生一次,类定义之后__开头的属性不会变形
3.该隐藏对外不对内
4.如果想让属性不被子类覆盖
隐藏属性的真正目的是为了不让使用者在类外不得直接操作属性
1.隐藏数据属性:
2.隐藏函数属性:
2.property 将函数伪装成数据属性
继承
1.什么是继承
继承是一种新建子类的方式,新建的类称之为子类/派生类,被继承的类被称为父类/基类。
子类会遗传父类的属性
2.为何要用继承
类是解决对象之间冗余问题的
继承可以解决类与类之间的冗余问题
3.如何继承
先抽象,再继承
对象 -> 类 -> 父类
在python中支持多继承,默认继承object类,但凡继承了object类中的子类,以及该子类的子子孙孙类都能用到object内的功能,称之为新式类。没有继承object类的子类,以及该子类的子子孙孙类都不能用到object内的功能,称之为经典类。
ps:只有在python2中才区分经典类与新式类,python3中都是新式类。
在非菱形继承关系下,新式类与经典类的属性查找属性都一样,都是一个分支一个分支地找下去
菱形继承
一个类继承的多个分支最终汇聚到一个非object类
c3算法会计算出一个mro列表(广度优先),可打印,mro是他妈
强调:属性查找的是属性查找发起者的mro列表
super()得到一个特别的对象,该对象访问的属性直接从父类中寻找
python2中需要传入(自己类名,self) python3不需要加
派生:
子类可以派生出自己新的属性,在进行属性查找时,子类中的属性名会优先于父类被查找。
解决方式(子类中调用父类的方法):
1.类名.方法()
2.super().方法()
继承表达关系:is-a
mixins继承:以Mixin, able, ible为后缀
组合表达的是:has-a
多态
可以在不用考虑对象具体类型的情况下直接使用对象(不同子类拥有同一方法,具体方法不同,但方法名相同),方便使用者。
python推崇鸭子类型(将不同类规划为同一类型,将没有关系的几个类,统一使用。),可以不继承也实现多态。
异常处理
1.什么是异常
如果是程序发生错误的信号,一旦程序出错python解释器就会产生一个异常
如果该异常没有被处理,该异常就会被抛出,程序的运行也随即结束
2.为何要处理异常
增强程序的健壮性(鲁棒性)
3.如何处理异常
1.语法错误SyntaxError(程序运行前会检测语法,语法不通过程序不会运行)
2.逻辑错误
1.尽量避免
2.针对无法预防的错误
try:
被检测的代码1
被检测的代码2
被检测的代码3
except 异常类型 as e:
处理异常的代码