在上一篇《手把手陪您学Python》41——类方法与实例方法中,我们引入了类方法的概念,并介绍了类方法与实例方法在语法规则和引用方面的差异。今天,我们将会继续介绍实例方法的应用,并介绍一种非常重要而又特殊的实例方法。

1、通过实例方法定义实例属性

在《手把手陪您学Python》40——类的定义、属性与实例化中,我们曾介绍过实例属性,是指通过给实例变量赋值,定义的只属于实例的而不属于类的属性。今天我们将会介绍一种新的定义实例属性的方法,就是通过实例方法来定义实例属性。

由于方法本身就比属性能够做更多的“事情”,所以通过实例方法定义的实例属性不但能够达到通过变量定义属性一样的效果,还具有更为强大的功能,实现更加灵活的人机互动。

像我们小时候玩超级玛丽总是觉得不过瘾,3条命根本不够通关的,要是能像魂斗罗一样,可以有30条命就好了。这时,我们就可以通过定义实例方法的方式来达到这样的目的。

第一种方式是实例方法中不包括参数。在实例方法里给实例属性赋值,也就是马里奥的生命值以及帽子的颜色已经在实例方法中确定了。当引用实例方法时,已经定义好的实例属性生效。

In [1]: class Mario:def star(self):self.life = 30   # 实例属性已经在实例方法中定义self.cap = "blue"
In [2]: small_mario = Mario()small_mario.star()   # 只引用实例方法,实例属性已经在实例方法中确定print(small_mario.life)print(small_mario.cap)
Out[2]: 30blue

第二种方式是实例方法中包括参数。在定义实例方法时,将实例属性的值作为实例方法的参数,在引用实例方法时,同时定义实例属性的值,也就是在实例化马里奥后确定生命值以及帽子的颜色了。

In [3]: class Mario:def star(self, life, cap):   # 实例属性的值作为实例方法的参数self.life = lifeself.cap = capIn [4]: small_mario = Mario()small_mario.star(30, "blue")   # 引入实例方法的同时定义实例属性print(small_mario.life)print(small_mario.cap)
​
Out[4]: 30blue

通过实例方法,让我们可以定义各种类型的实例属性,但是先是实例化,再通过引用实例方法定义实例属性的过程还是有些繁琐,有没有更简单的定义实例属性的方法呢,比如在实例化的过程中就直接定义好实例属性?答案是肯定的,这就是__init__()方法。

2、__init__()方法

__init__()方法是一种称之为“构造器”的特殊的实例方法。在创建实例的时候,即使不去引用__init__()方法,其中的命令也会自动执行。

如果__init__()方法是带有参数的,那么在类的实例化过程中,参数可以通过__init__()方法自动传递给实例。就可以不用先引用实例方法再给实例属性赋值了,实现了“一步到位”,是不是非常的神奇?所以,__init__()方法也经常被称为“魔法方法”。

与之前相同的是,也可以将__init__()方法中是否包括参数,将定义实例属性的方式分为两类。

与之前不同的是,由于__init__()方法能够自动执行,所以不需要再引用__init__()方法(也无法引用),而是在实例化马里奥时,同时完成了实例方法的引用,实例方法中已经确定的实例属性也就自动生效了(第一种方式);或者在实例化马里奥的同时定义实例属性的值(第二种方式)。

In [5]: class Mario:def __init__(self):self.life = 30   # 实例属性已经在实例方法中定义self.cap = "blue"
In [6]: small_mario = Mario()   # 实例化的同时实例方法执行,实例属性生效print(small_mario.life)print(small_mario.cap)
Out[6]: 30blue
In [7]: class Mario:def __init__(self, life, cap):   # 实例属性的值作为实例方法的参数self.life = lifeself.cap = cap
In [8]: small_mario = Mario(30, "blue")   # 实例化的同时给实例属性赋值print(small_mario.life)print(small_mario.cap)
Out[8]: 30blue

上面的例子中,我们将马里奥的生命值和帽子颜色或者是在实例方法中已经定义好,或者是在实例化的同时进行定义,但这两种方式都已经在程序中写死。如果我们在实例方法里或者实例化前,通过人机互动的方式,将定义实例属性的权利交给用户,就可以让用户自由定义生命值和帽子颜色了。

In [9]: class Mario:def __init__(self):number = input("请输入马里奥的生命值:")colour = input("请输入马里奥帽子的颜色:")self.life = number   # 实例属性已经在实例方法中定义self.cap = colour
In [10]: small_mario = Mario()   # 实例化的同时实例方法执行,实例属性生效print(small_mario.life)print(small_mario.cap)
Out[10]: 请输入马里奥的生命值:30请输入马里奥帽子的颜色:blue30red
In [11]: class Mario:def __init__(self, life, cap):   # 实例属性的值作为实例方法的参数self.life = lifeself.cap = cap
In [12]:  number = input("请输入马里奥的生命值:")colour = input("请输入马里奥帽子的颜色:")small_mario = Mario(number, colour)   # 实例化的同时给实例属性赋值print(small_mario.life)print(small_mario.cap)
Out[12]: 请输入马里奥的生命值:30请输入马里奥帽子的颜色:blue30red

3、其他魔法方法的应用

由于__init__()方法能够自动执行,所以除了能够自动执行__init__()方法下的语句,还可以引用其他实例方法或者属性,而无需人工引用,大大增加了程序的自动运行效率。

比如,我们可以让马里奥一出场就蹦蹦跳跳地,刚吃完蘑菇就打败了一个敌人。

In [13]: class Mario:def __init__(self, life, cap, name, food):self.life = lifeself.cap = capprint("{} has {} lifes.".format(name, self.life))print("{} has a {} cap.".format(name, self.cap))self.jump()self.eat(name, food)self.attack(name)def jump(self):print("Mario is jumping!")def attack(self,name):print("{} attacked an anomy!".format(name))def eat(self, name, food):print("Mario ate a {}!".format(food))print("{} became bigger!".format(name))
In [14]: small_mario = Mario(30, "red", "Small Mario", "red mushroom")
Out[14]: Small Mario has 30 lifes.Small Mario has a red cap.Mario is jumping!Small Mario ate a red mushroom!Small Mario became bigger!Mario attacked an anomy!

以上就是我们的通过实例方法定义实例属性的介绍,同时还对魔法方法的使用进行了重点说明。

下一篇,我们将会进一步学习类的知识,包括类的继承与魔法方法的其他应用,敬请关注。


感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^

要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。

《手把手陪您学Python》1——为什么要学Python?

《手把手陪您学Python》2——Python的安装

《手把手陪您学Python》3——PyCharm的安装和配置

《手把手陪您学Python》4——Hello World!

《手把手陪您学Python》5——Jupyter Notebook

《手把手陪您学Python》6——字符串的标识

《手把手陪您学Python》7——字符串的索引

《手把手陪您学Python》8——字符串的切片

《手把手陪您学Python》9——字符串的运算

《手把手陪您学Python》10——字符串的函数

《手把手陪您学Python》11——字符串的格式化输出

《手把手陪您学Python》12——数字

《手把手陪您学Python》13——运算

《手把手陪您学Python》14——交互式输入

《手把手陪您学Python》15——判断语句if

《手把手陪您学Python》16——循环语句while

《手把手陪您学Python》17——循环的终止

《手把手陪您学Python》18——循环语句for

《手把手陪您学Python》19——第一阶段小结

《手把手陪您学Python》20——列表

《手把手陪您学Python》21——元组

《手把手陪您学Python》22——字典

《手把手陪您学Python》23——内置序列函数

《手把手陪您学Python》24——集合

《手把手陪您学Python》25——列表推导式

《手把手陪您学Python》26——自定义函数

《手把手陪您学Python》27——自定义函数的参数

《手把手陪您学Python》28——自定义函数的返回值

《手把手陪您学Python》29——匿名函数

《手把手陪您学Python》30——模块

《手把手陪您学Python》31——文件的打开

《手把手陪您学Python》32——文件的读取

《手把手陪您学Python》33——文件的关闭

《手把手陪您学Python》34——文件的写入

《手把手陪您学Python》35——数据的存储

《手把手陪您学Python》36——错误和异常处理

《手把手陪您学Python》37——程序的重构

《手把手陪您学Python》38——第二阶段小结

《手把手陪您学Python》39——面向对象

《手把手陪您学Python》40——类的定义、属性与实例化

《手把手陪您学Python》41——类的方法与实例方法

For Fans:关注“亦说Python”公众号,回复“手42”,即可免费下载本篇文章所用示例语句。

亦说Python——Python爱好者的学习分享园地

《手把手陪您学Python》42——类的魔法方法相关推荐

  1. python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)

    python无处不对象的深刻理解 前面写了这么多,我觉得有必要从一个大的层面,也就是OO来看问题的本质.只要你调用对象的语法是合乎python的习惯的,那就是可以的,我们以前从来没有像下面这么写过,对 ...

  2. 《手把手陪您学Python》50——数组的dtype属性

    在上一篇<手把手陪您学Python>49--数组的shape属性中,我们对数组的"形状"及其表示方式有了更为深入的了解. 今天,我们将会继续学习数组的属性,但不是与数组 ...

  3. 《手把手陪您学Python》26——自定义函数

    在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...

  4. 手把手教你学Python之Pandas(一文掌握数据分析与处理库-Pandas)

    目录 基本结构之Series Series对象的创建 Index对象介绍 Series中数据的访问 Series中常用方法 基本结构之DataFrame DataFrame的创建 ​DataFrame ...

  5. 手把手教你学Python之Matplotlib绘图(一文掌握数据可视化库-Matplotlib)

    目录 Matplotlib介绍 线形图(折线图) 直方图 条形图 饼状图 散点图 Matplotlib介绍        matplotlib是一个Python 的2D绘图库,提供了一套表示和操作图以 ...

  6. 手把手教你学Python之文件操作(一文掌握文件操作)

    目录 1.Python中文本文件的读写 2.Python中常用的文件与文件夹操作方法 3.Python中Excel文件的读写 4.Python读取Excel文件案例​ 为了保存数据,方便修改和分享,数 ...

  7. python global用法_14_手把手教你学Python之函数(下)

    变量作用域:根据变量定义的位置,可将变量分为全局变量和局部变量. 全局变量:定义在函数外面的变量,可以在多个函数中进行访问,但不能执行赋值操作.如果有赋值语句,相当于创建了一个同名的局部变量: 局部变 ...

  8. oracle数据库更新语句_20_手把手教你学Python之操作数据库

    数据库是数据的仓库,将大量数据按照一定的方式组织并存储起来,方便进行管理和维护,例如快速检索和统计等.数据库的主要特点: 以一定的方式组织.存储数据: 能为多个用户共享: 与程序彼此独立. -- 数据 ...

  9. python中字典的value可以为任意对象_手把手教你学Python之字典

    字典是一种无序可变的容器,字典中的元素都是"键(key):值(value)"对, "键"和"值"之间用冒号隔开,所有"键值对&qu ...

最新文章

  1. Spring Data JPA 禁止自动更新
  2. mxnet创建新的操作(层)
  3. 近 5 亿人的隐私,毁于一位程序员之手?
  4. 2019.7.17刷题统计
  5. SVD 与 PCA 的直观解释(1): 线性变换
  6. 基于以太坊的去中心化存储协议Swarm计划在2季度发布1.0版
  7. python中string.digits_Python string.hexdigits方法代码示例
  8. 可视化 —— 二维平面上的散列点在坐标轴方向上的移动
  9. PHP has encountered an Access Violation at
  10. inovance变频器说明书参数设置_汇川(INOVANCE)MD300变频器说明书.pdf
  11. 2021年中国石油市场回顾及2022年行业发展趋势分析预测:2021年石油需求震荡修复,石油对外依存度首次下降,预计2022年石油需求7.35亿吨[图]
  12. 从农民到“互联网+农牧业”老板 谈谈我的站长之路
  13. Toony Colors Pro 2项目分析——身体其他部位shader
  14. Postman发送带cookie的http请求
  15. 大数据分析工程师面试集锦5--Spark面试指南
  16. 使用Webcam实现拍照功能
  17. 【ELM预测】探路者算法优化极限学习机预测(含前后对比)【含Matlab源码 2204期】
  18. IMX6ULL裸机程序--4.时钟树分析
  19. java网页截图_java-selenium 实现网页截图
  20. 计算机怎么弹奏送给未来的你,致未来的你经典句子 致未来的你好词好句

热门文章

  1. NotePad使用通配符查找/替换
  2. 是“药”三分毒:新冠病毒会开启监控文化吗?
  3. 微信小程序电子签名组件
  4. Meet Surprise品牌饰品相比于同行业的优势在哪里
  5. 转:Vim实战指南(二):光标移动技巧
  6. hp ProBook 4441s 修复记
  7. 【java】ClassLoader.getResources加载资源
  8. JZ59 滑动窗口的最大值,三种解法【较难】
  9. 社交媒体分析在未来业务中将发挥着至关重要的作用
  10. 如何在python中使用表情(emoji)符号?