Day09新手小白学python
第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法
目录
Day09新手小白学python
前言
一、面向对象介绍
二、类和对象的概念
三、定义类和对象
四、实例方法与属性
五、_init_方法
六、理解self
七、魔法方法
八、案例-决战紫禁之巅
九、练习
总结
前言
本文介绍了Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法
一、面向对象介绍
面向对象编程:OOP [object oriented programming],是一种python的编程思路。
面向过程:根据业务逻辑从上到下写代码。在思考问题的时候, 首先分析怎么按照步骤去实现,然后将问题解决拆解成若干个步骤,并将这些步骤对应成方法一步一步的,最终完成功能
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程,关注的是设计思维【找洗车店 给钱洗车】,面向对象适合做大项目
面向过程的关注点是: 怎么做 面向对象的关注点是: 谁来做
二、类和对象的概念
类和对象是面向对象编程中重要的概念
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
类相当于制造汽车的图纸,用这个图纸制造的汽车相当于对象
类:类是具有一组 相同或者相似特征【属性】和行为【方法】的一系列[多个]对象组合
对象: 对象是实实在在的一个东西,类的实例化,具象化
类是对象的抽象化 而对象是类的一个实例
现实世界 计算机世界
行为---------> 方法
特征---------->属性
三、定义类和对象
定义类
类(Class)由3个部分构成
类的名称: 类名
类的属性: 一组数据
类的方法: 允许对进行操作的方法 (行为)
创建对象
对象名 = 类名()
# 定义类和对象
# 类结构 类名 属性 方法
# class 类名:
# 属性
# 方法
class Person:
'''
对应人的特征
'''
name="小明" # 类属性
age=20 # 类属性
'''
对应人的行为
'''
def __init__(self):
self.name1='小刘' #实例属性
pass
def eat(self):
print("大口吃饭")
pass
def run(self):
print("飞快的跑")
pass
pass
# 创建一个对象【类的实例化】
# 规则格式 对象名=类名()
xm=Person()
xm.eat() #调用函数 输出:大口吃饭
xm.run() # 输出:飞快的跑
print("{}的年龄是:{}".format(xm.name,xm.age)) # 输出 小明的年龄是:20
print("{}的年龄是:{}".format(xm.name1,xm.age)) # 输出 小刘的年龄是:20
# 创建另外一个实例对象
xw=Person()
xw.eat() # 实例方法
四、实例方法与属性
实例方法
在类的内部定义,使用 def 关键字来定义。第一个参数默认为 self,且为第一个参数【名字标识可以是其他的名字,但是这个位置必须被占用】,只在调用该方法的时候传参,定义类的时候不需要传参
实例方法是归于 类的实例所有
属性:类属性、实例属性
类里面定义的变量。定义在类里面,方法外面的属性称之为类属性,;定义在方法里面,用def _init_定义,通过类似于self.变量名来定义的,称之为实例属性,在要用实例属性时,直接用self.变量名即可。
五、_init_方法
__init__(self) 方法:初始化方法,实例化对象的时候自动调用,即定义该对象的时候会自动调用,所以在定义对象的时候就要给他传参,完成一些初始化设置。
class People:
def __init__(self):
'''
实例属性
'''
self.name='小千'
self.sex='女生'
self.age=20
pass
def eat(self):
'''
吃的行为
:return:
'''
print('喜欢吃榴莲')
pass
xq=People()
xq.eat()
xq.name="小钱" # 添加实例属性
xq.sex="女" # 添加实例属性
xq.age=20 # 添加实例属性
print(xq.name,xq.sex,xq.age) # 输出:小钱 女 20
xl=People()
xl.name="小莫" # 添加实例属性
xl.sex="男" # 添加实例属性
xl.age=20 # 添加实例属性
print(xl.name,xl.sex,xl.age)
xm=People() # 在创建新对象时,是自动执行的 初始化方法
print(xm.name) # 输出结果:小千 输出的是定义的默认值
xm.name="小李"
print(xm.name) # 输出结果:小李
# 如果有n个这个对象被实例化 那么就需要添加很多次这样的属性 比较麻烦
__init__传参:考虑将属性当参数在实例化对象的时候传进去,让类更通用
# 改进:init 传递参数
class People:
def __init__(self,name,sex,age):
'''
实例属性
'''
self.name=name
self.sex=sex
self.age=age
pass
def eat(self,food): # 调用它的时候才会给他传递参数
'''
吃的行为
:return:
'''
print(self.name+'喜欢吃'+food) # 调用self.name 而不是name
pass
zp=People('张鹏','男',18) # 传入的参数是def _init_定义的参数
print(zp.name,zp.age) # 输出:张鹏 18
zp.eat("香蕉") # 输出: 张鹏喜欢吃香蕉
lh=People('小花','女',78)
print(lh.name,lh.age) # 输出:小花 78
lh.eat('苹果') # 输出:小花喜欢吃苹果
# 总结:_init_
# 1、Python自带的内置函数, 使用双下划线包起来,也称为【魔术方法】
# 2、是一个初始化的方法,用来定义实例属性和初始化数据的,在创建对象的时候自动调用的,不用手动调用
# 3、利用传参的机制可以让我们定义功能更加强大方便
六、理解self
self和对象指向同一个内存地址,可以认为self就是对象的引用。
self传参问题:所谓的self,可以理解为对象自己,某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可。self的名称是可以更改的,可以定义成其他的名字,只是约定俗成定义成了self
class Person:
def __init__(self,pro):
'''
:param pro:专业
'''
self.pro=pro # 实例属性的定义
pass
'''
定义类
'''
def eat(a,name,food):
'''
实例方法
:return:
'''
# print('self=%s'%(id(self)))
print('%s 喜欢吃 %s 专业是:%s' %(name,food,a.pro))
pass
pass
# xw是一个新的实例化对象
xw=Person('心理学') # 实例属性需要在定义时传参,因为def _init_在实例化对象的时候会自动调用,所以必须传递参数
print('xw=%s'%(id(xw))) # 输出结果是:xw=2392804216784
xw.eat('小王','榴莲') # 实例方法在调用该方法时传参即可 输出结果是:小王 喜欢吃 榴莲 专业是:心理学
# 小结 self特点
# self只有在类中 定义实例方法的时候才有意义,在调用时不必传入相应参数,而是由解释器自动去指向调用的对象
# self的名称是可以更改的,可以定义成其他的名字,只是约定俗成定义成了self
# self 指的是 类实例对象本身
七、魔法方法
在python中,有一些内置好的特定的方法,方法名是“__xxx__”,在进行特定的操作时会自动被调用,这些方法称之为魔法方法。
几种常见的魔法方法。
__init__方法:初始化一个类,在创建实例对象为其赋值时使用。
__str__方法:在将对象转换成字符串 str(对象) 测试的时候,打印对象的信息。
class Person:
def __init__(self,pro,name,food):
'''
:param pro:专业
:param name:名字
:param food:食物
'''
self.pro=pro # 实例属性的定义
self.name=name
self.food=food
pass
def __str__(self):
'''
打印对象,自定义对象,是内容格式的
:return:
'''
return '%s 喜欢吃 %s 专业是:%s' %(self.name,self.food,self.pro)
pass
# xw是一个新的实例化对象
xw=Person('心理学','小王','榴莲')
print(xw) # 没加时输出地址,加了def __str__(self):之后,直接输出对象,输出结果为:小王 喜欢吃 榴莲 专业是:心理学
__new__方法:真正创建并返回一个实例对象,调用了一次,就会得到一个对象。定义完执行时,先执行new创建当前实例对象,有了当前类再执行init进行初始化,__new__方法必须要返回当前创建的实例对象,否则对象创建不成功
class Person:
def __init__(self,pro,name,food):
'''
:param pro:专业
:param name:名字
:param food:食物
'''
self.pro=pro # 实例属性的定义
self.name=name
self.food=food
print("-----init----函数执行")
pass
def __str__(self):
'''
打印对象,自定义对象,是内容格式的
:return:
'''
return '%s 喜欢吃 %s 专业是:%s' %(self.name,self.food,self.pro)
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法 每调用一次 就会生成一个新的对象 cls就是class的缩写
场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
:param args:
:param kwargs:
:return:
'''
print("-----new----函数执行")
return object.__new__(cls) # 在这里是真正创建对象实例的,该语句创建对象实例并返回当前对象实例,先执行new创建当前类,有了当前类再执行init
pass
# xw是一个新的实例化对象
xw=Person('心理学','小王','榴莲')
print(xw) # 没加时输出地址,加了def __str__(self):之后,直接输出对象,输出结果为:小王 喜欢吃 榴莲 专业是:心理学
# _new_和_init_的区别
# _new_类的实例化方法 必须要返回该实例,否则对象创建不成功
# _init_ 用来做数据属性的初始化工作,也可以认为是实例的构造方法,self接受类的实例 并对其进行构造
# _new_至少有一个参数cls 代表要实例化的类,此参数再实例化时由python解释器自动提供
# _new_函数执行要早于_init_函数
__class__方法:获得已知对象的类 ( 对象.__class__)。
__del__方法:对象在程序运行结束后进行对象销毁的时候调用这个方法,来释放资源。
八、案例-决战紫禁之巅
决战紫禁之巅有两个人物,西门吹雪以及叶孤城
属性:
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 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:
'''
# 敌人减掉15滴血
enemy.hp-=15
info="【%s】砍了【%s】一刀"%(self.name,enemy.name)
print(info)
pass
def chiyao(self):
'''
吃药补血
:return:
'''
self.hp+=15
info="【%s】吃了一颗补血药增加了10滴血"%(self.name)
print(info)
pass
def __str__(self):
return "%s 还剩 %s 的血量"%(self.name,self.hp)
pass
# 第二步 创建两个实例化对象【西门吹雪,叶孤城】
xmcx=Role('西门吹雪',100)
ygc=Role('叶孤城',100)
while True:
if xmcx.hp<=0 or ygc.hp<=0:
# 满足条件退出循环
break
xmcx.tong(ygc) #西门吹雪捅了叶孤城
print(ygc) # 打印状态
print(xmcx)
print("*************************************")
ygc.kanren(xmcx)
print(ygc) # 打印状态
print(xmcx)
print("*************************************")
xmcx.chiyao()
print(ygc) # 打印状态
print(xmcx)
time.sleep(1) # 休眠暂停1s
print("对战结束")
九、练习
1、python中如何通过类创建对象,请用代码举例说明。如何在类中定义一个方法,请用代码举例说明。
class Person:
name="小李" # 类属性
def __init__(self,hobby):
self.pro="自动化" # 实例属性
self.age=20
self.hobby=hobby
pass
def run(self,time): # 实例方法
print("跑一千米花%s" %time)
pass
def eat(self):
print("最喜欢干饭")
pass
zx=Person("打球") # __init__ 传参
print(zx.name,zx.pro,zx.age,zx.hobby)
zx.run("四分")
zx.pro="测控"
zx.age=34
print(zx.name,zx.pro,zx.age,zx.hobby)
2、定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性
class Fruit:
def __init__(self,name,color):
self.name=name
self.color=color
print("我是%s,我是%s的" %(self.name,self.color))
pass
pass
pg=Fruit("苹果","红色")
jz=Fruit("橘子","橙色")
xg=Fruit("西瓜","绿色")
3、请编写代码,验证self就是实例本身。
class yanzheng:
def __init__(self,name,color):
self.name=name
self.color=color
print("我是%s,我是%s的" %(self.name,self.color))
print("我是__init__中的self,我的地址是%s" %id(self))
pass
def like(self,YN):
print(YN)
print("我是实例方法中的self,我的地址是%s" % id(self))
pass
pass
pg=yanzheng("苹果","红色")
pg.like("不好吃")
print("我是对象,我的地址是%s" %id(pg))
4、定义一个Animal类
(1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。
(2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。
(3)、定义一个__str__方法,输出对象的所有属性。
class Animal:
def __init__(self,name,color,age):
self.name=name
self.color=color
self.age=age
pass
def run(self,speed):
print("跑的{}".format(speed))
pass
def eat(self,shiwu):
print("最喜欢吃{}".format(shiwu))
pass
def __str__(self):
return "%s是%s的,%s" %(self.name,self.color,self.age)
pass
xiugou=Animal("小狗","黑白花","三个月")
print(xiugou)
xiugou.run("一般快")
xiugou.eat("狗粮")
rabbit=Animal("兔子","白色","一岁")
print(rabbit)
rabbit.run("最快")
rabbit.eat("胡萝卜")
总结
本文仅仅简单介绍了Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法