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中input和raw_input的一点区别
Oct 21 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
vscode 远程调试python的方法
Dec 01 Python
Python 支付整合开发包的实现
Jan 23 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
关于python字符串方法分类详解
Aug 20 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
Django中使用MySQL5.5的教程
Dec 18 Python
python3 自动打印出最新版本执行的mysql2redis实例
Apr 09 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP _construct()函数讲解
2019/02/03 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
tangram框架响应式加载图片方法
2013/11/21 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
python集合删除多种方法详解
2020/02/10 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
说明书格式及范文
2014/05/07 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
旷课检讨书范文
2015/01/27 职场文书
音乐研修感悟
2015/11/18 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
Python django中如何使用restful框架
2021/06/23 Python
PHP获取学生成绩的方法
2021/11/17 PHP