Python基础
六、面向对象
1.定义
面向对象编程 —— Object Oriented Programming
面向过程 和 面向对象,是两种不同的 编程方式
2.过程和函数
过程:是早期的一个编程概念,类似于函数,只能执行,但是没有返回值
函数:不仅能执行,还可以返回结果
3.面向过程
a.怎么做
1)把完成某一个需求的所有步骤从头到尾逐步实现
2)根据开发需求,将某些功能独立的代码封装成一个有一个函数
3)最后完成的代码,就顺序地调用不同的函数
b.特点
1)注重步骤与过程,不注重职责分工
2)需求复杂,代码会变得很复杂
3)开发复杂项目,没有固定的套路,开发难度很大
4.面向对象
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
a.谁来做
1)在完成某一个需求前,首先确定职责一一要做的事情(方法)
2)根据 职责 确定不同的对象,在对象内部封装不同的方法(多个)
3)最后完成的代码,就顺序地让不同的对象调用不同的方法
b.特点
1)注重对象和职责,不同的对象承担不同的职责
2)更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路
3)需要在面向过程基础上,再学习一些面向对象的语法
5.类和对象的概念
类和对象是面向对象编程的两个核心概念
类
a.类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用
特征被称为属性
行为被称为方法
b.类就相当于制造飞机时的图纸,是一个模板,是负责创建对象的
对象
a.对象是由类创建出来的一个具体存在,可以直接使用
b.由哪一个类创建出来的对象 ,就拥有在哪一个类中定义的: 属性 方法
c.对象就是相当于用图纸制造的飞机
在程序开发中,应该先有类,再有对象
6.类和对象的关系
a.类是模板,对象是根据类这个模板创建出来的应该先有类,再有对象
b.类只有一个,而对象可以有很多个
不同的对象之间属性可能会各不相同
c.类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少
7.类的设计
在程序开发中,要设计一个类,通常需要满足三个要素:
1.类名这类事物的名字,满足大驼峰命名法
2.属性这类事物具有什么样的特征
3.方法这类事物具有什么样的行为
大驼峰命名法
1.每一个单词的首字母大写
2.单词与单词之间没有下划线
8.类名的确定
a.名词提炼法,分析整个业务流程
b.出现的名词,通常就是找到的类
9.属性和方法的确定
a.对对象的特征描述,通常可以定义成属性
b.对象具有的行为(动词),通常可以定义成方法
七、面向对象基础语法
1.dir内置函数
a.在Python中,对象几乎时无所不在的,我们之前学习的变量、数据、函数都是对象
b.在Python中可以使用两个方法验证:
1)在标识符/数据后输入一个 . ,PyCharm会提示该对象能够调用的方法列表
2)使用内置函数dir传入标识符/数据,可以查看对象内的所有属性方法
注释:__方法名__格式的方法是Python提供的内置方法/属性
2.定义简单的类(只包含方法)
1)面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了!
2)语法格式:
方法的定义格式和函数几乎一样,区别在于第一个参数必须是self
类名的命名规则要符合大驼峰命名法
3)创建对象
当一个类定义完成后,要使用这个类来创建对象,语法格式:
八、引用概念的强调
面向对象开发中引用的概念是同样适用的
1.在Python中使用类创建对象之后tom变量中仍然记录的是对象在内存中的地址
2.也就是tom变量引用了新建的猫对象
3.使用print输出对象变量默认情况下,是能够输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)
注释:在计算机中,通常都是使用十六进制表示内存地址
九、给对象增加属性
1.在Python中要给对象设置属性,非常的容易,但是不推荐使用。因为:对象属性的封装应该封装在类的内部
2.只需要在类的外部的代码中直接通过,设置一个属性即可
注意:这种方式虽然简单但是不推荐使用!
3.使用self在方法内部输出每一只猫的名字
1)由哪一个对象调用的方法,方法内的self就是哪一个对象的引用
2)在类封装的方法内部,self就表示当前调用方法的对象自己调用方法时程序员不需要传递self参数
3)在方法内部
可以通过self访问对象的属性
也可以通过self调用其他的对象方法改造
十、初始化方法
1.在类的外部给对象增加属性
先调用方法再设置属性,程序会报错
2.初始化方法
3.在初始化方法内部定义属性
4.改造初始化方法——初始化的同时设置初始值
十一、 私有属性、单继承和方法重写
1.私有属性和方法
A.在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到
私有属性就是对象不希望公开的属性
私有方法就是对象不希望公开的方法
B.定义方式
在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法
2.伪私有属性和私方法
A.Python 中,并没有真正意义的私有
B.在给属性、方法命名时,实际是对名称做了一些特殊处理,使得外界无法访问处理方式: 在名称前面加上 __类名 __类名__名称
注释:在日常开发中,不要使用这种方式,访问对象的私有属性或私有方法
十二、面向对象三大特性
1.封装根据职责将属性和方法封装到一个抽象的类中
2.继承实现代码的重用,相同的代码不需要重复的编写
3.多态不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度
十三、单继承
1.继承的概念:
子类拥有父类的所有方法和属性
2.继承语法
子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
子类中应该根据职责,封装子类特有的属性和方法
3.继承的传递性
C 类从B类继承,B类又从A 类继承,那么C类就具有B类和A类的所有属性和方法
子类拥有父类以及父类的父类中封装的所有属性和方法
十四、方法的重写
1.子类拥有父类的所有方法和属性
2.子类继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
3.当父类的方法实现不能满足子类需求时,可以对方法进行重写(override)
4.重写父类方法有两种情况:
a.覆盖父类的方法
b.对父类方法进行 扩展
5.覆盖父类的方法
a.如果在开发中,父类的方法实现和子类的方法实现 完全不同
b.就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现
c.具体的实现方式,就相当于在子类中定义了一个和父类相同名的方法并且实现
d.重写之后,在运行时,只会调用子类中重写的方法,而不再会调用父类封装的方法
6.对父类方法进行扩展
7.调用父类的另一种方式
这种方式,目前在 python 3.x 还支持这种方式
这种方法不推荐使用,因为 一旦 父类发生变化,方法调用位置的 类名 同样需要修改
注释:在开发时,父类名 和 super( ) 两种方式不要混用,如果使用当前子类名调用方法,会形成递归调用,出现死循环