Python面向对象程序设计构造函数和析构函数用法分析


Posted in Python onApril 12, 2019

本文实例讲述了Python面向对象程序设计构造函数和析构函数用法。分享给大家供大家参考,具体如下:

构造函数和析构函数

1、构造方法的使用

很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名为init()的特殊方法(构造方法)来实例化一个对象。

构造方法也叫做构造器,是指当实例化一个对象(创建一个对象)的时候,第一个被自动调用的方法。

演示1:构造方法被调用的契机

class Person():
  #构造方法
  def __init__(self):
    print("构造函数被执行了")
  #创建对象的过程中构造函数被自动调用
p1 = Person()

输出:

构造函数被执行了

结论:创建对象的过程中调用了构造函数。

当未手动添加构造函数时,系统会默认提供一个无参的构造函数。

演示2:构造函数和普通函数之间的区别

说明:构造函数本质上还是一个函数,函数可以有参数,也可以无参,所以同样的道理,构造函数也是如此。

class Person():
  #一般情况下,构造方法的参数和成员变量有关,并且在设置的过程中与成员变量同名
  def __init__(self, name, age, height, weight):
    #print(nname, age, height, weight)
    #因为构造方法是创建对象的过程中被调用的
    #所以构造方法的作用一般是用来定义成员变量并且给成员变量赋值
    #定义属性并给属性赋值
    #通过self来进行区分是成员变量还是形参
    self.name = name
    self.age = age
    self.height = height
    self.weight = weight
  def run(self):
    print("run")
  def eat(self, food):
    print("eat "+ food)
'''
构造函数: __init__() 在使用类创建对象的时候自动调用
注意: 如果不显式的写出构造函数,默认会自动添加一个空的构造函数,函数体中什么都不实现
'''
per = Person("hanmeimei", 20, 170, 55)
print(per.name, per.age)
per.run()
per2 = Person("lili", 21, 175, 70)
print(per2.name, per2.age)

输出:

hanmeimei 20
run
lilei 21

2、self的使用

注意:self代表类的实例[对象],而非类本身

类的方法与普通的函数只有一个特殊的区别—>他们必须有一个额外的第一个参数名称,按照惯例它的名字是self。

self.__class__:返回的是当前类的类名

class Test():
  def prt(self):
    print(self)
    print(self.__class__)
t = Test()
t.prt()

输出:

<__main__.Test object at 0x0000017D47D81B00>
<class '__main__.Test'>

演示2:self不是python的关键字

class Person():
  def run(self):
    print("run")
    print(self.__class__)
    p = self.__class__("tt", 30, 10, 30)
  def eat(self,food):
    print("eat" + food)
  def say(self):
    print("hello, my name is %s, I am %d year old" % (self.name, self.age))
  def play(a):
    print("play", a.name)
  def __init__(self, name, age, height, weight):
    self.name = name
    self.age = age
    self.height = height
    self.weight = weight
# self代表此时正在创建对象,self.属性表示当前对象的属性
per1 = Person("tom", 20, 160, 80)
per1.say()
per2 = Person("henmeimei", 21, 160, 80)
per2.say()
per1.say()
per1.run()

输出:

hello, my name is tom, I am 20 year old
hello, my name is henmeimei, I am 21 year old
hello, my name is tom, I am 20 year old
run
<class '__main__.Person'>

3、析构函数的使用

析构函数调用的契机【对象被销毁的时候】:

1、程序执行结束,会自动调用析构函数
2、使用del 删除对象的时候,系统会自动调用析构函数

注意:如果没写析构函数,当符合析构函数调用的契机时,系统会自动调用父类的析构函数

演示:

class Person():
  def run(self):
    print("run")
  def eat(self, food):
    print("eat "+food)
  def __init__(self, name, age, height, weight):
    self.name = name
    self.age = age
    self.height = height
    self.weight = weight
   def __del__(self):
    print("析构函数被调用了")
per = Person("hanmeimei", 20, 170, 55)
#释放对象
del per
#注意:对象释放后就不能再进行访问了
#在函数里定义的对象,会在函数结束时自动释放,这样可以用来减少内存空间的浪费
#其实就是作用域的问题
def func():
  per2 = Person("aa", 1, 1, 1)
func()

输出:

析构函数被调用了
析构函数被调用了

class Animal(object):
  def __del__(self):
    print('Animal父类的析构函数被调用了')
class Cat(Animal):
  pass
cat = Cat()

输出:

Animal父类的析构函数被调用了

class A():
  def __init__(self):
    print("父类A构造函数被调用了")
  def __del__(self):
    print("父类A析构函数被调用了")
class B(A):
  def __init__(self):
    print("子类B构造函数被调用了")
    A.__init__(self)
  def __del__(self):
    print("子类B析构函数被调用了")
class C(A):
  pass
def main():
  b = B()
  del b
  print("*********************")
  c = C()
if __name__ == '__main__':
  main()

输出:

子类B构造函数被调用了
父类A构造函数被调用了
子类B析构函数被调用了
*********************
父类A构造函数被调用了
父类A析构函数被调用了

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python基础教程之对象和类的实际运用
Aug 29 Python
理解Python中的类与实例
Apr 27 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
Django实现基于类的分页功能
Oct 31 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 Python
python中列表的含义及用法
May 26 Python
Python打包为exe详细教程
May 18 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 #Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 #Python
Python实现的银行系统模拟程序完整案例
Apr 12 #Python
详解python--模拟轮盘抽奖游戏
Apr 12 #Python
Python实现的排列组合、破解密码算法示例
Apr 12 #Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 #Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 #Python
You might like
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
vue学习教程之带你一步步详细解析vue-cli
2017/12/26 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
小区门卫工作职责
2013/12/14 职场文书
大学生创业计划书的格式要求
2013/12/29 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
学生违反校规检讨书
2014/10/28 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
法定代表人证明书
2014/11/28 职场文书
生日宴会祝酒词
2015/08/10 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
Win11显卡控制面板打开显卡设置方法
2022/04/20 数码科技
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis