![](https://img-blog.csdnimg.cn/img_convert/84ea684387224b5805b2d536ea5da8f2.png)
![](https://img-blog.csdnimg.cn/img_convert/1f471eaf02db31f2c38b5ceb95160d06.png)
一、面向对象介绍
1.概述
面向过程:根据业务逻辑从上到下写代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向对象编程:OOP【object oriented programming】是一种python的编程思想,所有的事情打包给别人去做
面向过程:就是我们一开始的,按照解决问题的步骤去写代码,就是自己亲力亲为,一步一步的去解决问题
2.面向过程编程与函数式编程对比
![](https://img-blog.csdnimg.cn/img_convert/7621c00a88a3dc80cc05292bfa324282.png)
3.面向过程与面向对象对比
![](https://img-blog.csdnimg.cn/img_convert/e0df08009a753232ed62df6d03c329a7.png)
面向对象:关注的是设计思维【找洗车店、给钱就可以洗车了,我们并不要求去让自己理解洗车的步骤】
4.面向对象分析
![](https://img-blog.csdnimg.cn/img_convert/b78366ac36056b1fa5cdba4911284c3e.png)
5.面向对象与面向对象编程
![](https://img-blog.csdnimg.cn/img_convert/8089217b8cb75b498c659e46fd1f0bea.png)
二、类和对象
1.简介
类和对象是面向对象编程中重要的概念
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
![](https://img-blog.csdnimg.cn/img_convert/3d860ccf5bac3f0a17e740ff286c2774.png)
2.类的组成部分
![](https://img-blog.csdnimg.cn/img_convert/f75ba45f64507ffe7cf3e829710ccf4c.png)
类:是具有一组相同或者相似特征【属性】和行为【方法】的一系列对象的集合
对象:是类的实例化,是实实在在的
类是对象的抽象化,对象是类的具体化
3.类的抽象
![](https://img-blog.csdnimg.cn/img_convert/3e7ca68821add03b452c699d2972423e.png)
三、定义类和对象
1.定义类
![](https://img-blog.csdnimg.cn/img_convert/75d7deba86878d63302f2ba6a4157df1.png)
class Person():
#属性
name='林然'
age=18
def printInfo(self):
print('{}的年龄是:{}'.format(self.name,self.age))
2.创建对象
![](https://img-blog.csdnimg.cn/img_convert/78f29bf842ebbdf60b4368e0c66ecadb.png)
class Person():
#属性
name='林然'
age=18
def printInfo(self):
print('{}的年龄是:{}'.format(self.name,self.age))
#创建对象
lr=Person()
lr.printInfo()#方法使用
结果:
![](https://img-blog.csdnimg.cn/img_convert/2bfc0170e2f862c106c366a01e3ea680.png)
四、实例方法与属性
1.实例方法
![](https://img-blog.csdnimg.cn/img_convert/9cc7f124303b175075c931528cf10cc8.png)
实例方法:在类的内部使用def关键字定义的方法,并且该方法的第一个参数默认是self【名字标识可以是其他名字,但是这个位置必须被占用】,类的实例方法是归于类的方法
2.属性
![](https://img-blog.csdnimg.cn/img_convert/5bde8945ac9a57ef073cd83b5447c8df.png)
属性:在类内部,方法外部定义的变量,定义在方法内部使用self引用的属性【self.属性】就是实例属性
五、__init__方法
![](https://img-blog.csdnimg.cn/img_convert/17bdae8bf042a61840538632aa87b33d.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://img-blog.csdnimg.cn/img_convert/0e09853097c090f3ab396556146fe4fb.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://img-blog.csdnimg.cn/img_convert/dd71d836da1688129af9005f19461ec2.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://img-blog.csdnimg.cn/img_convert/34fdef9a95b739b34e90484a2c454d9e.png)
class Person():
'''
定义类
'''
def eat(self):#
'''
实例方法
:return:
'''
print('self=%s'%id(self))
pass
pass
xw=Person()#实例化对象
print('xw=%s'%id(xw))
xw.eat()
![](https://img-blog.csdnimg.cn/img_convert/dcaea59aa09f07088e702fda38fe54e5.png)
也就是self和实例化对象是同一个东西
2.self传参问题
![](https://img-blog.csdnimg.cn/img_convert/f17fc2c1002e877be54ac5717b6e9c23.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://img-blog.csdnimg.cn/img_convert/8faf082aed91536d749c502e412f56ad.png)
2.__str__方法
![](https://img-blog.csdnimg.cn/img_convert/66f7d6d8713a9ed75f7406c62c1b5a10.png)
![](https://img-blog.csdnimg.cn/img_convert/038b19f9cec69ae72ce8ac1d8da366d4.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://img-blog.csdnimg.cn/img_convert/5a92b771aa8aaa727bfcbe0f13add076.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://img-blog.csdnimg.cn/img_convert/849ec2ba14a0e96b08d3fbac4757e10f.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://img-blog.csdnimg.cn/img_convert/636cfdb8fc99d2987d605c9aaf32b68b.png)
__new__和__init__函数的区别
__new__类的实例化方法,必须要返回该实例,否则对象就会创建不成功
__init__用来做数据属性初始化工作,也可以认为是实例的构造方法,接受类的实例,接受类的实例self并对其进行构造
__new__至少要一个参数是cls代表要实例化的类,此参数是在实例化时由Python解释器自动提供
八、项目实战-决战紫禁之巅
1.需求分析
![](https://img-blog.csdnimg.cn/img_convert/9be4e61a760f84e7655184b87dd57f94.png)
2.实现步骤
![](https://img-blog.csdnimg.cn/img_convert/1ad8eaf38ba42e688ce00c5eece36b14.png)
![](https://img-blog.csdnimg.cn/img_convert/80ef5eae16fc4d11e242f8b15fad66d0.png)
![](https://img-blog.csdnimg.cn/img_convert/07cfbbcf14f9582100378d1813386a5a.png)
![](https://img-blog.csdnimg.cn/img_convert/6c4ca5b7e7b7b47f3af22b6cbff97823.png)
![](https://img-blog.csdnimg.cn/img_convert/ed0ae3f8c88c46948064734719e7bdd7.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://img-blog.csdnimg.cn/img_convert/2addd6b2868205ecf91def37f1c58935.png)
九、知识点小结
知识点总结1
![](https://img-blog.csdnimg.cn/img_convert/6e8429cbe3dda9c555a0f37c2fbf2a47.png)
知识点总结2
![](https://img-blog.csdnimg.cn/img_convert/587a4152a00399eecef894a368d9615b.png)
十、课后问答题
什么是类,什么是对象
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
python中定义一个类的语法格式是什么
class 类名():
方法列表
属性
3、类(class)由哪三个部分构成
类名
属性
方法
4、init方法有什么作用,如何定义
是一个初始化的方法,用来定义实例属性和初始化数据的,在创建对象的时候自动调用,不需要手动调用
5、方法中的"self"代表什么。
实例化对象本身
6、在类中定义init方法的时候第一个形参必须是self吗?self可以用其他东西代替吗?
是的,self的那个位置可以用其他的名称代替
7、Python面向对象中的魔法方法,是如何定义的,魔法方法需要开发人员去调用吗?
不需要,编译器自动调用
8、str方法可以没有返回值,这句话是否正确?
不正确
9、查看下面代码,请写出有那些是属性,那些是实例方法。
![](https://img-blog.csdnimg.cn/img_convert/29a5d9c4273a854bc1d91632a544ac01.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、请将课件上 决战紫荆之巅 重写一遍,并理解每一个方法的使用。