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在命令行下使用google翻译(带语音)
Jan 16 Python
Python的标准模块包json详解
Mar 13 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Sanic框架Cookies操作示例
Jul 17 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
python模拟点击网页按钮实现方法
Feb 25 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Python下划线5种含义代码实例解析
Jul 10 Python
Python anaconda安装库命令详解
Oct 16 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP新手上路(六)
2006/10/09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
2006/12/16 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
2018/09/19 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
django_orm查询性能优化方法
2018/08/20 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
科技活动周标语
2014/10/08 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
会计做账心得体会
2016/01/22 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
Oracle 多表查询基本语法实例
2022/04/18 Oracle