Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法
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='小刘' #实例属性passdef eat(self):print("大口吃饭")passdef run(self):print("飞快的跑")passpass# 创建一个对象【类的实例化】
# 规则格式 对象名=类名()
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=20passdef eat(self):'''吃的行为:return:'''print('喜欢吃榴莲')pass
xq=People()
xq.eat()
xq.name="小钱" # 添加实例属性
xq.sex="女" # 添加实例属性
xq.age=20 # 添加实例属性
print(xq.name,xq.sex,xq.age) # 输出:小钱 女 20xl=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=nameself.sex=sexself.age=agepassdef eat(self,food): # 调用它的时候才会给他传递参数'''吃的行为:return:'''print(self.name+'喜欢吃'+food) # 调用self.name 而不是namepass
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))passpass
# 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=nameself.food=foodpassdef __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=nameself.food=foodprint("-----init----函数执行")passdef __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创建当前类,有了当前类再执行initpass
# 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=nameself.hp=hppassdef tong(self,enemy):'''捅一刀:param enemy:敌人:return:'''# 敌人减掉10滴血enemy.hp-=10info="【%s】捅了【%s】一刀"%(self.name,enemy.name)print(info)passdef kanren(self,enemy):'''砍人:param enemy: 敌人:return:'''# 敌人减掉15滴血enemy.hp-=15info="【%s】砍了【%s】一刀"%(self.name,enemy.name)print(info)passdef chiyao(self):'''吃药补血:return:'''self.hp+=15info="【%s】吃了一颗补血药增加了10滴血"%(self.name)print(info)passdef __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:# 满足条件退出循环breakxmcx.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=20self.hobby=hobbypassdef run(self,time): # 实例方法print("跑一千米花%s" %time)passdef 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=nameself.color=colorprint("我是%s,我是%s的" %(self.name,self.color))passpass
pg=Fruit("苹果","红色")
jz=Fruit("橘子","橙色")
xg=Fruit("西瓜","绿色")
3、请编写代码,验证self就是实例本身。
class yanzheng:def __init__(self,name,color):self.name=nameself.color=colorprint("我是%s,我是%s的" %(self.name,self.color))print("我是__init__中的self,我的地址是%s" %id(self))passdef like(self,YN):print(YN)print("我是实例方法中的self,我的地址是%s" % id(self))passpass
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=nameself.color=colorself.age=agepassdef run(self,speed):print("跑的{}".format(speed))passdef eat(self,shiwu):print("最喜欢吃{}".format(shiwu))passdef __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中的魔法方法
Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法相关推荐
- python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...
楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...
- python中property魔法方法原理_Python类中的魔法方法之 __slots__原理解析
在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性. 每次实例化一个对象python都会分配一个固定大小内存的字典来保存属性,如果 ...
- Python中的魔法方法
1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...
- python中的魔法方法__new___Python魔法方法会调用new方法吗?
Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明:一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修 ...
- python中getitem_Python类中的魔法方法之 __getitem__ 和 __getattr__
1.getitem 方法 使用这个方法最大的印象就是调用对象的属性可以像字典取值一样使用中括号['key'] 使用中括号对对象中的属性进行取值.赋值或者删除时,会自动触发对应的__getitem__. ...
- PHP类与对象详细介绍
基本概念 class 每个类的定义都以关键字class开头,后面跟着类名,类名后面跟着一对花括号,里面包含有类的属性与方法的定义. 类名可以是任何非PHP保留字的合法标签.一个合法类型以字母或下划线开 ...
- python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...
python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...
- js中关于Blob对象的介绍与使用
js中关于Blob对象的介绍与使用 blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是js ...
- python 魔法方法常用_Python魔法方法指南
有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...
最新文章
- [Bug]由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值的解决方法(转)...
- 判断一个数是不是回文数
- 说说“开源杀死商业开发工具”
- Flask 路由映射对于双斜线的处理 //a//b
- Eclipse 导入项目到git@osc中
- python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!
- 《redis-php中文参考手册》-php版
- 微信小程序之——自定义分享按钮(完整版)
- lanmp_wdcp_v2.4快速安装RPM包发布
- Matrix Cookbook 公式推导
- 主成分分析(PCA)与线性判别分析(LDA)的区别与联系
- 又是一次数据分析的例子(自杀分析)
- javaweb医院科室管理系统springboot
- 基于BP神经网络的英文字母识别
- 不能用了?Newbing新教程,解决重定向错误
- 计算机复制操作的方法,怎么用键盘复制粘贴?电脑使用键盘复制粘贴的方法
- 30 岁转行做程序员是什么样的体验
- 《Android 软件安全与逆向分析》---- 学习笔记
- 文献 | 如何快速将英文文献翻译为中文?
- 如何让自己时刻冷静的方法_情绪激动时如何冷静下来?教你4招很管用
热门文章
- 我的合租生活1----忍无可忍就无须再忍
- 创作工具抖音Android,抖音灵魂出窍特效制作bgm安卓版-抖音灵魂出窍特效制作软件v1.5.0 最新版-腾牛安卓网...
- android iphone 通讯录 360,怎样把安卓手机的通讯录导入到iphone中
- 一文搞懂Python字符串
- Java实现 LeetCode 322 零钱兑换
- 微软专家销售部,热招
- 网络安全之 社工 ​使用谷歌搜索引擎收集信息​
- 网线接口和电话线接口的区别
- win10系统怎么搜索xp计算机,win10怎么重装winxp_win10上如何安装xp系统
- 2015年律师行业就业前景分析