夜光序言:

恋人分手之际,还能把话说得平和得体的,肯定是已然变心的那一个。

正文:

5.3 对象初始化 
 
5.3.1 目标

面向对象的程序设计中在对象实例化时往往要对实例做一些初始化工作,例如设置实例的属性的初始值,而这些工作时自动完成的,因此有默认的方法被调用,这个默认的方法就是构造函数,与之匹配的是析构函数。教学目标就是要掌握构造函数与析构函数的使用方法,为个人信息类进行初始化。


5.3.2 构造与析构方法

在 Python 中有一些内置的方法,这些方法命名都有比较特殊的地方(其方法名以 2 个下划线开始然后以 2 个下划线结束)。类中最常用的就是构造方法和析构方法。

构造方法__init__(self,....)在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行。如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。

析构方法__del__(self)在释放对象时调用,可以在里面进行一些释放资源的操作,不需要显示调用。


例 5-3-1: 构造方法函数与析构方法函数

class Person:
 def __init__(self,n):
 print("__init__",self,n)
 self.name=n
 def __del__(self):
 print("__del__",self)
 def show(self):
 print(self,self.name)
p=Person("james")
p.show()
print(p)

结果:
__init__ <__main__.Person object at 0x00000015C4DA72E8> james
james <__main__.Person object at 0x00000015C4DA72E8>
<__main__.Person object at 0x00000015C4DA72E8>
__del__ <__main__.Person object at 0x00000015C4DA72E8>

在执行 p=Person()语句是建立一个 Person 类对象实例 p,于是自动调用__init__函数,并向这个函数传递两两个参数,一个是对象实例p传递给self,另外是"james"传递给n参数,于是在__init__中我们看到:

__init__ <__main__.Person object at 0x00000015C4DA72E8> james
其中看到 p 对象的内存地址是 0x00000015C4DA72E8。
接下来执行 p.show(),它是通过实例调用的,于是会把 p 实例传递给函数 show 的 self参数,于是在 show 中看到:

<__main__.Person object at 0x00000015C4DA72E8> james
这个 self 地址与 p 是一样的,是同一个对象。在执行 print(p)时也看到:
<__main__.Person object at 0x00000015C4DA72E8>
主程序中的 p 对象也时这个地址。
程序结束时自动销毁 p 对象,于是看到__del__函数执行:
__del__ <__main__.Person object at 0x00000015C4DA72E8>


5.3.3 对象的初始化

构造函数__init__是建立对象实例的自动调用函数,我们可以在这个函数中为实例对象初始化属性值。


例 5-3-2:对象初始化

class Person:
 def __init__(self,n,g,a):
 self.name=n
 self.gender=g
 self.age=a
 def show(self):
 print(self.name,self.gender,self.age)
p=Person("james","male",21)
p.show()

结果:
james male 21
这个程序在执行语句:
p=Person("james","male",21)
时就调用__init__函数,并传递 4 个参数给它,通过:
 self.name=n
 self.gender=g
 self.age=a
语句这个实例就生成了 name,gender,age 属性,而且值由参数 n,g,a 确定。注意这几个属性是实例对象自己的属性,不是类 Person 的类属性。
在 Python 中只允许有一个__init__函数,我们通过对__init__函数参数的默认值方法可以实现重载,例如:
p=Person("james")
是错误的,因为__init__需要 4 个参数,而这里只提供 2 个参数。但是修改__init__的定义,使得它带默认参数就可以。


例 5-3-3:设置__init__中有默认参数

class Person:
 def __init__(self,n="",g="male",a=0):
 self.name=n
 self.gender=g
 self.age=a
 def show(self):
 print(self.name,self.gender,self.age)
a=Person("james")
b=Person("james","female")
c=Person("james","male",20)
a.show()
b.show()
c.show()
那么都是正确的,结果:
james male 0
james female 0
james male 20


5.3.4 理解实例方法

类的实例方法都至少带有一个参数,而且第一个参数通常命名为 self,在实例调用这个方法时会把实例自己传递给这个 self 参数。


例 5-3-4:实例方法的 self 参数

class Person:
 def __init__(self,n="",g="male",a=0):
 self.name=n
 self.gender=g
 self.age=a
 def show(self):
 print(self)
 print(self.name,self.gender,self.age)
p=Person("james","male",20)
Person.show(p)
p.show()

结果:
<__main__.Person object at 0x000000C395A47710>
james male 20
<__main__.Person object at 0x000000C395A47710>
james male 20
其中 Person.show(p)的效果与 p.show()是一样的,只是 Person.show(p)时我们直接把实例 p 传递给 self 参数,而 p.show()调用时 p 自动递给 show 的 self,因此在 show 中都可以使用 self.name,self.gender,self.age 访问到 p 的属性。


5.3.5【案例】我的日期类

1、案例描述 
编写一个日期类 MyDate,拥有年月日的数据。
 
2、案例分析 
定义 MyDate__init__函数实现对象的初始化,在数据不合理时抛出异常。
 
3、案例代码

class MyDate:__months=[0,31,28,31,30,31,30,31,31,30,31,30,31]def __init__(self,y,m,d):if y<0:raise Exception("无效年份")if m<1 or m>12:raise Exception("无效月份")if y%400==0 or y%4==0 and y%100!=0:MyDate.__months[2]=29else:MyDate.__months[2]=28if d<1 or d>MyDate.__months[m]:raise Exception("无效日期")self.year=yself.month=mself.day=ddef show(self,end='\n'):print("%04d-%02d-%02d" %(self.year,self.month,self.day),end=end)
try:d=MyDate(2019,5,13)d.show()
except Exception as e:print(e)
结果:
2019-05-13

零基础 学 python开发 (Genius套餐A) 二十九相关推荐

  1. 小甲鱼python笔记_小甲鱼《零基础学习Python》课后笔记(二十九):文件——一个任务...

    动动手 0.编写一个程序,接受用户的输入并保存为新的文件,程序实现如图: 代码如下:f_name = input('请输入文件名:') f = open(f_name, 'wt') print(&qu ...

  2. 【零基础学Java】—List集合(三十九)

    [零基础学Java]-List集合(三十九) java.util.list接口 extends Collection接口 list接口的特点: 1.有序的集合,存储元素和取出元素的顺序是一致的(存储1 ...

  3. 【零基础学Java】—继承的概述(十九)

    [零基础学Java]-]继承的概述(十九) 一.面向对象的三大特征 面向对象的三大特征:封装性,继承性,多态性 继承是多态的前提,如果没有继承,就没有多态 继承解决的主要问题就是:共性抽取 继承关系的 ...

  4. 零基础 学 python开发 (Genius套餐A) 四十一

    夜光序言: 人,可以爱到什么地步? 爱到,表面仍能不动声色微笑,内心却以常人难以发觉的惊人速度衰老,直至最后枯竭. 正文: 7.5 实践项目 学生成绩管理 7.5.1 目标 学生成绩记录包括学号(pN ...

  5. 零基础 学 python开发 (Genius套餐A) 二十六

    夜光序言: 能够让人从癫狂中沉静,从暴戾中平和的力量,就是所谓的爱情吧~~ 正文: 4.7 实践项目:我的英文字典    4.7.1 项目目标 实现一个简单的英语字典查询与管理程序.一个英文单词包含单 ...

  6. 【零基础学Python】爬虫篇 :第十四节--爬虫+词云解决实际问题

    十行代码帮助小姐姐给偶像送上最真挚的礼物----爬虫词云齐上阵,熬夜精心制作 905.png#pic_center) 故事背景 最近嘛,有位朋友找我帮忙嘛,希望我帮她做一份礼物,送给一直鼓舞着她不断向 ...

  7. 小甲鱼python的课后题好难_小甲鱼《零基础学习Python》课后笔记(二十六):字典——当索引不好用时2...

    测试题 0.Python的字典是否支持一键(Key)多值(Value)? 不支持.对相同的键赋值会覆盖原来的值.>>> dict2 = {1:'one',1:'two',3:'thr ...

  8. 小甲鱼《零基础学习Python》课后笔记(二十八):文件——因为懂你,所以永恒

    测试题 0.下边只有一种方式不能打开文件,请问是哪一种,为什么? f = open('E:/test.txt','w') # A f = open('E:\test.txt','w') # B f = ...

  9. python语言程序设计难不难_零基础学Python编程开发难度大吗?从哪学起?

    转行零基础学Python编程开发难度大吗?从哪学起? 近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大? 今天,小编就来为大家详细解读一下这个问题. ...

最新文章

  1. 神策数据丨7 大分析云案例,揭开 232 亿美元市场的秘密
  2. [hihoCoder]无间道之并查集
  3. C4C和CRM里获取当前登录用户分配的Organization Unit信息
  4. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
  5. 深入理解JavaScript闭包(closure) 【收藏】
  6. 【转载】DRuid 大数据分析之查询
  7. 搭建局域网HTTP FTP服务
  8. Java 13 发布进入倒计时!
  9. average diffusion distance
  10. 验证GridControl Gridview 单元格。
  11. [译] What is some general advice for a new PhD student?
  12. web前端优化一些看法
  13. JAVA系列---项目打包部署
  14. Windows Latex写作之VScode + TeX Live
  15. C语言逻辑运算符: 和 ||
  16. CDA数据分析LEVEL1--数据结构
  17. 测试宝宝体重的软件,如何测试宝宝身高体重
  18. 计算机常用程序在DOS中的英文名
  19. JS gkb转utf8(fetch gbk网页是乱码)
  20. 商务翻译证,高级商务翻译证

热门文章

  1. 使用开源代码实现二维码扫描和生成
  2. 计算机机械和设计专业有哪些方面,机械设计与制造及自动化专业的发展方向是什么,将来从事哪方面的工作,月薪如何...
  3. JAVA中的选择结构语句
  4. python教程 it教程网_it教程网Python实战班视频免费下载
  5. 调试腾讯转码接口报错问题{“code“:4100,“message“:“\u8eab\u4efd\u8ba4\u8bc1\u5931\u8d25\uff0c\u53c2\u6570\u9519\u8b
  6. adb传输文件报错couldn‘t create file:Read-only file system
  7. 【0】Windows游戏安全之路——个人学习背景
  8. CSDN 编程竞赛三十二期题解
  9. 【星辰傀儡线·命运环·卷一 血鸦】 9 鲜血、痛苦与毁灭
  10. VScode 第二篇 =》 语言快速切换 (中文 英文 繁体等)