![](https://i-blog.csdnimg.cn/blog_migrate/35aa5ae87a59a45594016e5e386a955d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/23be5ff373c05a51299c131d9838a4db.png)
一、面向对象介绍
1.概述
面向过程:根据业务逻辑从上到下写代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向对象编程:OOP【object oriented programming】是一种python的编程思想,所有的事情打包给别人去做
面向过程:就是我们一开始的,按照解决问题的步骤去写代码,就是自己亲力亲为,一步一步的去解决问题
2.面向过程编程与函数式编程对比
![](https://i-blog.csdnimg.cn/blog_migrate/0744194603291488cf60c0a4fa5c6d2d.png)
3.面向过程与面向对象对比
![](https://i-blog.csdnimg.cn/blog_migrate/3cc7c3d81311371a7de62f2b90c27621.png)
面向对象:关注的是设计思维【找洗车店、给钱就可以洗车了,我们并不要求去让自己理解洗车的步骤】
4.面向对象分析
![](https://i-blog.csdnimg.cn/blog_migrate/987a36167a9149bff67e94a9b1112349.png)
5.面向对象与面向对象编程
![](https://i-blog.csdnimg.cn/blog_migrate/4f3ae953120d090d564d6a8d05547b94.png)
二、类和对象
1.简介
类和对象是面向对象编程中重要的概念
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
![](https://i-blog.csdnimg.cn/blog_migrate/ff4c7276544a7c48e139289c1c682651.png)
2.类的组成部分
![](https://i-blog.csdnimg.cn/blog_migrate/8c510b3aeed203778abc7ff38cce397a.png)
类:是具有一组相同或者相似特征【属性】和行为【方法】的一系列对象的集合
对象:是类的实例化,是实实在在的
类是对象的抽象化,对象是类的具体化
3.类的抽象
![](https://i-blog.csdnimg.cn/blog_migrate/e123407d5674c892d48c040b452d8d64.png)
三、定义类和对象
1.定义类
![](https://i-blog.csdnimg.cn/blog_migrate/739a5c11d9e8cf8d3fe696bbdb7b5b7b.png)
class Person():
#属性
name='林然'
age=18
def printInfo(self):
print('{}的年龄是:{}'.format(self.name,self.age))
2.创建对象
![](https://i-blog.csdnimg.cn/blog_migrate/768dafbb4e6dd89e5dc970f75712850e.png)
class Person():
#属性
name='林然'
age=18
def printInfo(self):
print('{}的年龄是:{}'.format(self.name,self.age))
#创建对象
lr=Person()
lr.printInfo()#方法使用
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/76959c38c11f6399b80c04543f489a67.png)
四、实例方法与属性
1.实例方法
![](https://i-blog.csdnimg.cn/blog_migrate/b18af400ceb03a4269be9ed7c054914c.png)
实例方法:在类的内部使用def关键字定义的方法,并且该方法的第一个参数默认是self【名字标识可以是其他名字,但是这个位置必须被占用】,类的实例方法是归于类的方法
2.属性
![](https://i-blog.csdnimg.cn/blog_migrate/be11731eaef8ca13ba869533d4bdb217.png)
属性:在类内部,方法外部定义的变量,定义在方法内部使用self引用的属性【self.属性】就是实例属性
五、__init__方法
![](https://i-blog.csdnimg.cn/blog_migrate/223a4faf56019f7ffbbe7a5f22d2b3cc.png)
1.类的属性可以追加
class People:
def eat(self):
'''
吃的行为
:return:
'''
print('喜欢吃辣条')
pass
lr=People()
lr.name='林然'#追加实例属性
lr.sex='男生'#追加实例属性
lr.age=18#追加实例属性
lr.eat()
print(lr.name,lr.sex,lr.age)
xl=People()
xl.name='林然'#追加实例属性
xl.sex='男生'#追加实例属性
xl.age=18#追加实例属性
#如果有多个这样的对象被实例化,那么就需要添加很多次这个的操作,显然是麻烦的
2.__init__(self) 方法
![](https://i-blog.csdnimg.cn/blog_migrate/51c72c3fda41cfdbc19c59ec7cd29a11.png)
class People:
def __init__(self):
'''
系统在创建对象时,自动调用
'''
self.name='小倩'
self.sex='女生'
self.age=20
pass
def eat(self):
'''
吃的行为
:return:
'''
print('喜欢吃辣条')
pass
xm=People()
print(xm.name)#直接输出的是默认值,就已经含有该属性了
xm.name='小明'
print(xm.name)
3.__init__传参
![](https://i-blog.csdnimg.cn/blog_migrate/20c62f7eb39879ec3a77e4eec71295d6.png)
class People:
def __init__(self,name,sex,age):
'''
系统在创建对象时,自动调用
'''
self.name=name
self.sex=sex
self.age=age
pass
lm=People('李明','男',18)#这样不同的对象就有不同的特征值
print(lm.name,lm.sex,lm.age)
4.总结:__init__
python自带的内置函数,具有特殊的函数,使用双下划线包起来的也称为【魔术方法】
是一个初始化的方法,用来定义实例属性和初始化数据的,在创建对象的时候自动调用,不需要手动调用
利用传参的机制可以让我们定义功能更加强大并且更加方便
六、理解self
1.self是什么?
![](https://i-blog.csdnimg.cn/blog_migrate/65dd34807ba2eb9eae747857814936fe.png)
class Person():
'''
定义类
'''
def eat(self):#
'''
实例方法
:return:
'''
print('self=%s'%id(self))
pass
pass
xw=Person()#实例化对象
print('xw=%s'%id(xw))
xw.eat()
![](https://i-blog.csdnimg.cn/blog_migrate/d69ee96a61928df627f201692da082c8.png)
也就是self和实例化对象是同一个东西
2.self传参问题
![](https://i-blog.csdnimg.cn/blog_migrate/464df6fb87a5461e5182fb409504756e.png)
class Person():
'''
定义类
'''
def eat(self,name,food):#
'''
实例方法
:return:
'''
print('%s 喜欢吃 %s'%(name,food))
pass
pass
xw=Person()#实例化对象
xw.eat('林然','苹果')
3.小结
self只有在类中定义实例方法的时候才有意义,在调用时候不必传入相应的参数,而是由解释器自动去指向
self的名字是可以更改的,可以定义成其他的名字,只是约定俗成地定义成了self
self指的是实例化本身,就类似于JAVA中的this
七、魔术方法
1.概述
![](https://i-blog.csdnimg.cn/blog_migrate/b4ff73b55c7b617d8d60ddae0868fd0d.png)
2.__str__方法
![](https://i-blog.csdnimg.cn/blog_migrate/5d7c4ceeef77811a6fcb630fa382d5b5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c6f345163c20a944cb5e97e4fbbec6fb.png)
class Person():
'''
定义类
'''
def __init__(self,name,food):
self.name=name
self.food=food
def __str__(self):
'''
打印对象,自定义对象的内容输出
:return:
'''
return '%s 喜欢吃 %s'%(self.name,self.food)
xw=Person('小王','苹果')#实例化对象
print(xw)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/ef4b5872bbcac9a0ad27dbe487a08377.png)
3.__new__方法
在我们的__new__方法,只是输出了信息,所以并没创建对象,也就是对象创建失败了,所以Init方法也就木有
class Person():
'''
定义类
'''
def __init__(self,name,food):
print('init执行了')
self.name=name
self.food=food
def __str__(self):
'''
打印对象,自定义对象的内容输出
:return:
'''
return '%s 喜欢吃 %s'%(self.name,self.food)
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法,每调用一次就会生成新的对象,cls就是class的缩写
:param args:
:param kwargs:
'''
print('执行的new方法')
xw=Person('小王','苹果')#实例化对象
print(xw)
![](https://i-blog.csdnimg.cn/blog_migrate/3251fabe4d8aeac9fc1fd41917418687.png)
也就是要先有对象,执行new,采用实例化init
class Person():
'''
定义类
'''
def __init__(self,name,food):
print('init执行了')
self.name=name
self.food=food
def __str__(self):
'''
打印对象,自定义对象的内容输出
:return:
'''
return '%s 喜欢吃 %s'%(self.name,self.food)
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法,每调用一次就会生成新的对象,cls就是class的缩写
:param args:
:param kwargs:
'''
print('执行的new方法')
return object.__new__(cls)#这里是真正创建,当我们不显示创建这个函数,编译器会自动创建
#场景:可以控制创建对象的一些属性限定,经常用来做单例模式的时候来使用
xw=Person('小王','苹果')#实例化对象
print(xw)
![](https://i-blog.csdnimg.cn/blog_migrate/7100c669c39cb86002934ebfad13b066.png)
__new__和__init__函数的区别
__new__类的实例化方法,必须要返回该实例,否则对象就会创建不成功
__init__用来做数据属性初始化工作,也可以认为是实例的构造方法,接受类的实例,接受类的实例self并对其进行构造
__new__至少要一个参数是cls代表要实例化的类,此参数是在实例化时由Python解释器自动提供
八、项目实战-决战紫禁之巅
1.需求分析
![](https://i-blog.csdnimg.cn/blog_migrate/edef973b2b2a1e8fd3d6c2565bde5dd9.png)
2.实现步骤
![](https://i-blog.csdnimg.cn/blog_migrate/2f1828c1b5cf4e19db17fdaf6db2e011.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d88323b790d64eb45fc8c963ff04f60b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/84f8af5f61e17bbe80bee6c70a01f096.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3d2e7e4c53682547a26f9fe340c79dc7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8bca7cb563fb7b04f73a41e1780b74e7.png)
3.实际代码
'''
决战紫禁之巅有两个人物,西门吹雪以及叶孤城
属性:
name 玩家的名字
blood 玩家血量
方法:
tong() 捅对方一刀,对方掉血10滴
kanren() 砍对方一刀,对方掉血15滴
chiyao() 吃一颗药,补血10滴
__str__ 打印玩家状态。
'''
#第一步:需要先去定义一个类【角色类】
import time#导入时间的包
class Role:
def __init__(self,name,hp):
'''
:param name: 角色名
:param hp: 血量
'''
self.name=name
self.hp=hp
pass
def __str__(self):
return '%s的血量:%d'%(self.name,self.hp)
def tong(self,enemy):
'''
捅他
:param enemy: 敌人
:return:
'''
#敌人减掉10滴血
enemy.hp-=10
info='【%s】捅了【%s】一刀'%(self.name,enemy.name)
print(info)
pass
def kanren(self,enemy):
'''
砍人
:param enemy:
:return:
'''
enemy.hp -= 15
info = '【%s】砍了【%s】一刀' % (self.name, enemy.name)
print(info)
pass
def chiyao(self):
'''
吃药
:param enemy: 敌人
:return:
'''
self.hp+=10
info = '【%s】吃了一颗补药,增加十滴血' % (self.name)
print(info)
pass
#第二步,创建两个实例化对象【西门吹雪、叶孤城】
xmcx=Role('西门吹雪',100)
ygc = Role('叶孤城', 100)
while True:
if xmcx.hp<=0 or ygc.hp<=0:
break
xmcx.tong(ygc)#西门吹雪捅了叶孤城一刀
print(xmcx)#打印对象状态
print(ygc)
print('***********************************')
ygc.kanren(xmcx)
print(xmcx)#打印对象状态
print(ygc)
print('***********************************')
xmcx.chiyao()
print(xmcx)#打印对象状态
print(ygc)
print('***********************************')
time.sleep(1)#休眠一秒
print('对战结束')
结果;
![](https://i-blog.csdnimg.cn/blog_migrate/816bd5d85c30d24c9b62d6d3d8b6ecf3.png)
九、知识点小结
知识点总结1
![](https://i-blog.csdnimg.cn/blog_migrate/4538e9a1fa22f5db7e20e94688f98525.png)
知识点总结2
![](https://i-blog.csdnimg.cn/blog_migrate/0d2d1826a81ada73265ebd52a3d27c70.png)
十、课后问答题
什么是类,什么是对象
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
python中定义一个类的语法格式是什么
class 类名():
方法列表
属性
3、类(class)由哪三个部分构成
类名
属性
方法
4、init方法有什么作用,如何定义
是一个初始化的方法,用来定义实例属性和初始化数据的,在创建对象的时候自动调用,不需要手动调用
5、方法中的"self"代表什么。
实例化对象本身
6、在类中定义init方法的时候第一个形参必须是self吗?self可以用其他东西代替吗?
是的,self的那个位置可以用其他的名称代替
7、Python面向对象中的魔法方法,是如何定义的,魔法方法需要开发人员去调用吗?
不需要,编译器自动调用
8、str方法可以没有返回值,这句话是否正确?
不正确
9、查看下面代码,请写出有那些是属性,那些是实例方法。
![](https://i-blog.csdnimg.cn/blog_migrate/d9828cdda8fa60dffde935f460d2ac6c.png)
十一、实训题
python中如何通过类创建对象,请用代码举例说明。
2、如何在类中定义一个方法,请用代码举例说明。
class Student():
def run(self):
print('加油')
pass
pass
lr=Student()#创建一个对象
lr.run()
3、定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
class fruit():
def __init__(self,name,color):
self.name=name
self.colro=color
pass
def __str__(self):
return '%s的颜色是%s'%(self.name,self.colro)
pass
pg=fruit('苹果','红色')
print(pg)
print('*'*20)
jz=fruit('桔子','橙色')
print(jz)
print('*'*20)
xg=fruit('西瓜','黑皮')
print(xg)
4、请编写代码,验证self就是实例本身。
class Person():
def print_self(self):
print('self=%s'%(id(self)))
p1=Person()
print('p1=%s'%(id(p1)))
p1.print_self()
5、定义一个Animal类
(1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
(2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。
(3)、定义一个__str__方法,输出对象的所有属性。
'''
(1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
(2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。
(3)、定义一个__str__方法,输出对象的所有属性。
'''
class Animal():
def __init__(self,color,name,age):
self.color=color
self.name=name
self.age=age
def __str__(self):
return '%s的颜色是%s,年龄是%s'%(self.name,self.color,self.age,)
def run(self):
print('%s在跑'%self.name)
def eat(self):
print('%s在吃' % self.name)
monkey=Animal('金色','猴子','3')
print(monkey)
monkey.run()
monkey.eat()
6、请将课件上 决战紫荆之巅 重写一遍,并理解每一个方法的使用。