面向对象编程 类与对象的概率和使用
一:面向过程编程VS面向对象编程
面向过程编程
面向过程 核心是过程二字, 指的是解决的步骤, 既先干啥,在干啥,后干啥
基于该思想写程序就在设计一条条的流水线
举例:
1. 洗衣服
2. 把大象放冰箱中需要几步?
1. 把冰箱门打开
2. 把大象放进去
3. 关上冰箱门
优点: 复杂的问题流程化,进而简单化
缺点: 牵一发而动全身, 扩展性差
应用场景:对扩展性要求不高的地方
二:面向对象编程
面向对象编程
核心是 对象 二字, 对象指的是盛放相关的数据与功能的容器
基于该思想编写程序就在创造一个个的容器来把相关的东西盛到一起
什么是对象?
1.程序中:
函数:盛放数据的容器
对象:盛放数据的函数的容器
优点: 扩展性强,可维护性强
缺点: 加大了编程的复杂度
应用场景:对扩展性要求较高的地方
三:对象的概念
面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,什么意思?
对象: 特征与技能的结合体
所有的程序都是由 数据 与 功能 组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作,在学习 对象 之前,程序中的数据与功能是分离开的,如下:
数据: name,age,sex
name = 'iiii'
age = 18
ses = 'female'
功能: tell_info
def tell_info(name, age, ses):
print('%s %s %s' % (name, age, ses))
注:此时若想执行查看个人信息的功能,需要同时拿来两样东西,一类是功能tell_info,另外一类则是多个数据name、age、sex,然后才能执行,非常麻烦
tell_info(name,age,ses)
在学习了 对象 之后,我们就有了一个容器, 该容器可以盛放数据与功能,所有我们可以说:对象是把数据与功能整合到一起的产物,或者说 对象 就是一个盛放数据与功能的容器/箱子/盒子。
四:类的定义
对象:特征与技能的结合体
类:一系列对象相似的特征与相似的技能的结合体
1.程序中:
必须先定义类,然后在调用类产生对象
类既类别/种类, 是面向对象分析和设计的基石,如果多个对象有相似的数据与功能,那么该多个对象就属于同一种类。有了类的好处是:我们可以把同一类对象相同的数据与功能存放到类里,而无需每个对象都重复存一份,这样每个对象里只需存自己独有的数据即可,极大的节省了空间。
所以,如果说对象是用来存放数据与功能的容器,那么类则是用来存放多个相同数据与功能的容器。
综上所述,虽然我们是先介绍对象后介绍类,但是
需要强调的是:
在程序中,必须要事先定义类,然后再调用类产生对象(调用类拿到的返回值就是对象)。产生对象的类与对象之间存在关联,这种关联指的是:对象可以访问到类中共有的数据与功能,所以类中的内容仍然是属于对象的,类只不过是一种节省空间,减少代码冗余的机制,面向对象编程最终的核心仍然是去使用对象。
五:类与对象
类定义阶段发生的三件事
1.会执行类体的代码
2.会产生一个类的名称空间,用来将类体代码运行过程中产生的名字都丢进去
3.将名称空间的内存地址绑定给类名
类是用来解决对象之间代码冗余问题的
定义类
class Student:
定义一个属性
school = "SH"
空对象 'egon' 18 'male' []
def __init__(stu_dic, name, age, gender, courses=None):
if courses is None:
courses = []
stu_dic.name = name
stu_dic.age = age
stu_dic.gender = gender
stu_dic.courses = courses
定义一个技能
def choose_course(stu_dic, course):
stu_dic['courses'].append(course)
print('学生 %s 选课成功 %s' % (stu_dic['name'], stu_dic['courses']))
调用类也发生了三件事
1.会创建空对象/空字典,(调用__new__方法来创建的空对象)
2.会自动触发类中__init__函数运行,__init__(空对象..'egon',18,'male'),完成对象的初始化操作:注意:__init不能有返回值
3.返回该对象 赋值给stu1_dic
stu1_dic = Student('egon', 18, 'male') 产生一个空字典指向类
产生对象调用类
stu2_dic = Student('tom', 38, 'female')
调用类产生对象,默认产生的就是一个空字典
print(stu1_dic.__dict__) 这个是查看自身名称空间中的名字
print(stu1_dic.name) 可直接用.的方式去访问(先去自身查找name再去类名称空间中查找)
print(stu2_dic.__dict__) 这个是查看自身名称空间中的名字
查看类的名称空间
print(Student.__dict__)