一、面向对象基础
1.概念
1.1面向对象的设计思想
面向对象是基于万物皆对象这个哲学观点,在Python中,一切皆对象
举例说明:
案例一:我想要吃大盘鸡
面向过程 面向对象
1.自己去买菜 1.委托一个会砍价的人帮忙去买菜
2.自己择菜 2.委托一个临时工帮忙择菜
3.自己做菜 3.委托一个厨师帮忙做菜
4.自己开始吃 4.自己开始吃
案例二:小明是一个电脑小白,想要配一台电脑,买完零件后需要运到家里,组装完成后打开电脑玩游戏
面向过程 面向对象
1.小明补充电脑知识 1.委托一个懂电脑的朋友(老王)去帮忙买零件
2.小明去买零件 2.委托一个能跑腿的人将零件运送到家里
3.小明把零件带回家里 3.委托一个会组装电脑的人帮小明组装电脑
4.小明组装电脑 4.小明自己打开电脑,开始玩游戏
5.小明开机玩电脑
1.2面向过程和面向对象的区别【面试题】
面向过程
在生活案例中:
一种看待问题的思维方式,在思考问题的时候,着眼于问题是怎样一步一步解决的,然后亲力亲为的去解决问题
在程序中:
1》代码从上而下顺序执行
2》每一模块内部均是由顺序、选择和循环三种基本结构组成
3》程序流程在写程序时就已决定
面向对象
在生活案例中:
也是一种看待问题的思维方式,着眼于找到【一个具有特殊功能的具体个体,然后委托这个个体去做某件事情】,我们把这个个体就叫做对象,一切皆对象
是一种更符合人类思考习惯的思想【懒人思想】,可以将复杂的事情简单化,将程序员从执行者角度转换成了指挥者角度
在程序中:
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象
1》对同类对象抽象出其共性,形成类
2》类中的大多数数据,只能用本类的方法进行处理
3》程序流程由用户在使用中决定
4》使用面向对象进行开发,先要去找具有所需功能的对象,如果该对象不存在,那么创建一个具有该功能的对象
注意:面向对象只是一种思想,不是一门编程语言,也不会绑定编程语言
面向过程和面向对象的优缺点【面试题】
面向过程:
优点:性能较高,比如单片机,嵌入式开发等一般采用的是面向过程的方式,因为性能是最重要的因素
缺点:没有面向对象易于维护,易于复用,易于扩展,开销比较大,比较消耗资源
面向对象:
优点:易于维护,易于复用,易于扩展,因为面向对象有封装、继承和多态的特征,可以涉及出低耦合的系统,使得系统更加灵活
缺点:性能较低
使用面向对象解决问题,其中的核心内容:类和对象
2.类和对象【重点掌握】
2.1概念
类:一个具有特殊功能的实体的集合【群体】,是抽象的概念
对象:在一个类中,一个具有特殊功能的实体,能够帮忙解决特定的问题【对象也被称为实例】,是具体的存在
两者之间的关系:类用于描述某一类对象的共同特征,而对象则是类的具体存在
问题:先有对象还是先有类?
先有对象,再有类-----》将多个具有共同特征的对象,抽取一个类出来
先有类,再有对象----》在代码中,一般都是先定义类,通过类创建对象,
举例:
类 对象
人 张三、李四、王麻子、杨阳。。。
SuperHero 蝙蝠侠、蜘蛛侠、美国队长。。。
快递 顺丰、圆通、申通、韵达。。。
帮助理解:类也是一种数据类型,只不过是自定义的,用于描述生活中的一些事物,且Python中并没有提供这些类型,跟学过的intAct,float,str。。。。类似,用类创建对象则相当于定义一个类的变量
2.2类的定义
格式:
class 类名(): 类体 # ()可以省略说明:
a.Python中使用class关键字定义类
b.类名只要是一个合法的标识符即可,但是要求:遵循大驼峰命名法【每个单词的首字母大写】 ,如:KeyError,ValueError,NameError,IndexError…….
c.尽量使用单个或多个有意义的单词连接而成,类名中一般不使用下划线
d.通过缩进来体现类体的存在
e.类体一般包含两部分内容:对类的特征描述和行为描述
f.类的包含两部分:类的声明和类的实现
# 1.类是一种数据类型 # a num = 10 # 定义一个变量 print(type(num)) # <class 'int'> # b. v = ValueError() # 创建一个对象 print(type(v)) # <class 'ValueError'> # 2.类的定义 # a.函数的定义 # def func(): # print('ok~~~~~func') # b.类的定义 class Check(): # 一般不会在类中print print('ok~~~~class') class MyClass1(): pass class MyClass2: pass # 通过类创建对象,语法:变量 = 类名() m1 = MyClass1() print(m1) m2 = MyClass2() print(m2,id(m2)) m22 = MyClass2() print(m22,id(m22)) ''' 总结: a.类和函数相比,函数必须调用才能执行其中的代码,但是类只要定义完毕,其中的内容就会被加载一遍 b.在同一个py文件中,可以定义多个类,但是,如果要实现的需求较为复杂,一般会结合模块使用,在一个模块中定义一个类 c.定义类的过程中,类名后面的()可以省略 d.创建对象:变量 = 类名(),此处的()不能省略 e.同一个类,默认情况下,可以创建无数个对象,每个对象都会被分配不同的地址 f.直接输出对象,默认的情况下,会得到一个地址 '''
2.3对象的创建
# 通过类创建对象,语法:变量 = 类名() m1 = MyClass1() print(m1) m2 = MyClass2() print(m2,id(m2)) m22 = MyClass2() print(m22,id(m22))
2.4类的设计
只需要关心3个要素
事物名称(类名):人类(Person)
特征:身高(height)、年龄(age)—————》名词———》变量
行为:跑(run)、打架(fight)———————》动词————》函数
初期学习,通过提炼动名词进行类的提取
# 类的定义 class Person(): # 行为描述:函数 ''' 关于self a.self不是关键字,本质上可以是一个任意的标识符,但是使用self表示自己【self在Java中是关键字】 b.类中的函数,默认的情况下,形参列表的第一个参数都是self c.self表示当前对象,哪个对象调用该函数,则self表示哪个对象 d.当调用函数的时候,self无需手动传参,会自动将当前对象传参给self,只需要注意自己定义的参数的传参即可 ''' def eat(self,food): print(f'eating {food}',f'self:{id(self)}') def run(self): print('running') def show(self): print(f'姓名:{self.name},年龄:{self.age}') # 哪个对象调用show函数,则输出的就是该对象对应的属性 # 创建对象 p1 = Person() print(p1) p2 = Person() print(p2) # 特征描述:变量,语法:对象.属性 = 值 # 对一个对象进行某个特征的描述,可以借助于变量表示,此时的变量也可以被称为属性 p1.name = '张三' p1.age = 20 # print(p1.name,p1.age) p2.name = '李四' p2.age = 18 p2.height = 180 # print(p2.name,p2.age,p2.height) # 对象能且只能执行当前类中的行为【对象调用当前类中的函数】,语法:对象.函数(实参) print('p1:',id(p1)) p1.eat('apple') # p1.run() p1.show() print('p2:',id(p2)) p2.eat('banana') # p2.run() p2.show()
2.5案例一
''' 需求:开学了,王老师让小明,小花,小丽做自我介绍 介绍内容包括:姓名,年龄,爱好 展示一段才艺 ''' ''' 分析: a.定义教师类和学生类 b.教师类 特征:姓名 行为:让 学生 做自我介绍 c.学生类 特征:姓名,年龄,爱好 行为:做 自我介绍 才艺展示 ''' # 第一步:定义类 class Teacher(): # self表示老师对象,stu是一个学生对象,只要一个变量表示的是某个对象,则该变量作为对象使用,可以访问对象的属性或类中的函数 def let_stu_introduce(self,stu): print(stu) print(f'{self.name}让{stu.name}做自我介绍') # 学生开始执行自己的行为:做自我介绍和才艺战术 stu.introduce() stu.show_talent() class Student(): def introduce(self): print(f'大家好,我是{self.name},今年{self.age},爱好{self.hobby}') def show_talent(self): if self.name == '小明': print(f'接下来给大家展示一段{self.hobby},我家里有几百头牛,几百头 标签:__,函数,对象,self,Day20,print,和析构,def,name From: https://blog.csdn.net/m0_61388098/article/details/142306203