一、面向对象ObjectOriented:条理构成功能的元素,组建模型
OO:面向对象
OOA:面向对象的分析
OOD:面向对象的设计
OOI:面向对象的实现
OOP:面向对象的编程
OOA->OOD->OOI:面向对象的实现过程
类和对象的区别:
类:抽象名词,代表一个集合里面共性的事物,一大类事物
对象:具象的事物,单个个体,代表的是一类事物的某个个体,比如类的实例
类里面应该有两块内容:
1、属性(变量):表明事物的特征,一般用名词
2、成员方法(函数):表明事物的功能或动作
二、类的基本实现
命名规范:1、遵循变量命名规范;2、大驼峰写法;3、避开系统关键字以及和关键字相似的命名
声明:1、使用class关键字;2、内部右属性和方法构成,比如不允许使用for,for必须写到方法里面;3、成员属性定义可以直接使用变量赋值,如果不赋值,建议使用None
三、anaconda基本使用
anaconda主要是一个虚拟环境管理器,还是一个安装包管理器
conda list:显示anaconda安装的包
conda env list:显示anaconda的虚拟环境列表
conda create -n xxx python=3.6:创建一个名称为xxx的python3.6版本的虚拟环境
1 ''' 2 定义一个学生类 3 ''' 4 class student(): 5 pass 6 #定义一个对象 7 mingyue = student() 8 ''' 9 定义一个学python的学生类 10 ''' 11 class PythonStudent(): 12 name = None 13 age = 18 14 course = "Python" 15 def doHomework(self): 16 print("I 在做作业") 17 return None #函数末尾推荐使用return语句,即便无返回值,可以写None 18 yueyue = PythonStudent() 19 print(yueyue.name,yueyue.age) 20 yueyue.doHomework() 21 print(yueyue.__dict__,PythonStudent.__dict__) #打印对象下的所有成员(属性+方法)和类下的所有成员
上面代码打印如下:
四、类和对象的成员分析
1、类和对象都可以存储成员,成员可以归类所有,也可以归对象所有
2、类存储成员时使用的是与类关联的一个对象
3、独享存储成员是存储在当前对象中
4、对象访问一个成员,优先寻找对象下的成员,如果没有,才去找类中同名成员
5、类实例的属性和其对象实例的属性,在不对对象实例属性赋值的前提下,指向同一个变量;
创建对象的时候,类中的成员不会放入对象当中,而是得到一个空对象,没有成员;
通过对象对类中成员的重新赋值或者通过对象添加成员时,对应的成员会保存在对象中,而不修改类成员;举例如下:
五、self
self在对象方法中表示当前对象本身,如果通过对象调用一个方法,self会自动传入到当前方法的第一个参数
self并不是关键字,只是一个用于接收对象的普通参数,理论上可以用任何一个普通变量名代替
方法中有self形参的方法叫做非绑定类的方法,可以通过对象访问,没有self参数的方法叫做绑定类的方法,只能通过类访问
访问类的成员变量,通过__class__.成员名来访问,举例如下:
六、面向对象的三大特性:封装、继承、多态
1、封装:就是对对象成员进行访问限制
封装的三个级别:公有的public、受保护的protected、私有的private,它们3个不是关键字
对象的位置:对象内部、对象外部、子类中
私有的private:私有成员是最高级别的封装,只能再当前类或对象中访问
在成员前面添加两个下划线表示
Python的私有不是真私有,是一种name mangling的改名策略(用__dict__将类所有成员打印出来可以看到在类中写成私有的__成员,改名成了_类名__成员)
公共的public:成员前面不做任何添加,默认共有的
受保护的protected:是将对象成员进行一定级别的封装,然后,在类中或者子类中都可以进行访问,但是外部不可以
写法:在成员名称前面添加一个下划线
2、继承:就是一个类可以获得另外一个类中的成员属性和成员方法
作用:减少重复代码,增加代码复用性,同时可以设置类与类之间的关系
继承和被继承的概念:
被继承的类称为父类,也叫基类,也叫超类
用于继承的类称为子类,也叫派生类
继承和被继承一定存在一个 is-a 关系(This is a xxx)
语法:继承类的参数中填入被继承的类名
继承的特征:所有的类都继承自object类,即所有的类都是object类的子类
子类一旦继承父类,则可以使用父类中除私有成员外的所有内容
子类继承父类后并没有将父类成员完全赋值到子类中,而是通过引用关系访问调用
子类可以定义独有的成员属性和方法
子类中定义的成员和父类成员如果同名,则优先使用子类成员
子类如果想扩充父类的方法,可以再定义新方法的同时访问父类的成员进行代码重用,写法:父类名.父类成员的格式来调用父类成员,也可以使用super().父类成员来调用
继承变量函数的查找顺序:
优先查找自己的变量,没有则继续往上(父类)查找
构造函数如果本类中没有定义,则自动查找调用父类构造函数,如果本类中有定义,则不继续向上查找
构造函数:
是一类特殊的函数,在类进行实例化之前调用
如果定义了构造函数,则实例化的时候使用此构造函数,而不查找父类构造函数,如果没定义构造函数,则自动向上查找父类构造函数
如果子类没有定义构造函数,而父类的构造函数带参数,则实例化子类时,应该按按父类构造函数参数传参
super:不是一个关键字,而是一个类
super作用是获取MRO(MethodResolustionOrder)方法解析顺序列表中的第一个类,而这个类往往就是它的父类,和父类没有任何实质性关系
用super()调用父类的初始化构造函数
单继承和多继承
单继承:每个类只能传承一个类
多继承:每个类允许继承多个类
二者优缺点:
单继承优点:传承有序、逻辑清晰、语法简单、隐患少
缺点:功能不能无限扩展,只能在当前唯一的继承链中扩展
多继承优点:类的功能扩展方便
缺点:继承关系混乱
菱形继承/钻石继承问题 :
多个子类继承自同一个父类,这些子类又被同一个类继承,于是继承关系图形成了一个菱形图谱
关于多继承的MRO:
MRO就是多继承中,用于保存继承顺序的一个列表
Python本身采用C3算法来计算多继承的菱形继承进行计算得出结果
MRO列表的计算原则:
子类永远在父类前面
如果多个父类,则根据继承语法中括号内内的书写顺序存放
如果多个类继承了同一个父类,孙子类中只会选取继承语法括号中写的第一个父类的父类
3、多态(课外知识之java中解释:一个函数由于函数签名不同,可以有不同函数存在,同一个名,调用的时候根据函数签名不同,自动找到相应函数执行)
同一个对象在不同情况兄下有不同状态出现
Python中多态不是语法,而是一种设计思想
多态性:一种调用方式,产生不同的执行效果
多态:同一事物的多种形态
1、Mixin设计模式
主要采用多继承方式对类的功能进行扩展
我们使用多继承语法来实现Mixin,因此使用Mixin实现多继承的时候要非常小心
首先它必须表示某一单一功能,而不是某个物品
功能职责必须单一,如果有多个功能,则写多个Mixin
Mixin的实现不能依赖子类
子类即使没有继承这个Mixin,也能照样工作,只是缺少了某个功能
优点:
使用Mixin可以在不对类进行任何修改的情况下,扩充功能
可以方便的组织和维护不同功能组件的划分
可以根据需要任意调整功能类的组合
可以避免创建很多新的类、,导致类的继承混乱
七、类的相关函数