析构函数
python中有两个特殊的方法, 一个是构造方法__init__, 另一个是析构方法__del__.文章源自玩技e族-https://www.playezu.com/26200.html
构造方法__init__,具有初始化的作用,也就是当该类被实例化的时候就会自动执行该函数。那么通常就可以把要先初始化的属性放到这个方法里面。文章源自玩技e族-https://www.playezu.com/26200.html
析构方法__del__是对象在被垃圾回收的时候起作用的一个方法,它的执行一般也就意味着对象不能够继续引用, 回收内存.文章源自玩技e族-https://www.playezu.com/26200.html
当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数会被调用一次,这样可以用来释放内存空间文章源自玩技e族-https://www.playezu.com/26200.html
#!/usr/bin/env python
#-*- coding: utf-8 -*-
class foo:
#初始化方法
#创建完对象后会自动被调用
def __init__(self):
print('构造方法被调用')
#析构方法
#当对象被删除时,会自动被调用,然后释放内存
def __del__(self):
print('脚本运行结束, 释放内存')
#创建对象
f = foo()
print('这应该是脚本最后一句.')
运行结果:文章源自玩技e族-https://www.playezu.com/26200.html
构造方法被调用 这应该是脚本最后一句. 脚本运行结束, 释放内存 process finished with exit code 0
正确运行时不会去调用__del__方法, 会先打印"这应该是脚本最后一句." 当对象结束其生命周期时(例如对象所在的函数已经调用完毕), 系统会自动执行析构函数,析构函数往往用来做清理善后的工作. 所以打印"脚本运行结束, 释放内存"成了最后执行的语句.文章源自玩技e族-https://www.playezu.com/26200.html
当使用del 删除对象时,会调用他本身的析构函数, 相当于手动释放内存文章源自玩技e族-https://www.playezu.com/26200.html
class foo:
#初始化方法
#创建完对象后会自动被调用
def __init__(self):
print('构造方法被调用')
#析构方法
#当对象被删除时,会自动被调用,然后释放内存
def __del__(self):
print('脚本运行结束, 释放内存')
#创建对象
f = foo()
#删除对象
del f
print('这应该是脚本最后一句.')
运行结果:文章源自玩技e族-https://www.playezu.com/26200.html
构造方法被调用 脚本运行结束, 释放内存 这应该是脚本最后一句. process finished with exit code 0
del f语句执行时候, 内存立即被回收, 即执行打印"脚本运行结束, 释放内存". 最后才是执行打印"这应该是脚本最后一句."文章源自玩技e族-https://www.playezu.com/26200.html
作用通常是销毁/删除临时的变量,主要对那些长期占用内存的临时变量进行销毁.文章源自玩技e族-https://www.playezu.com/26200.html
构造函数
构造函数也被称为构造器,当创建对象的时候第一个被自动调用的函数,系统默认提供了一个无参的构造函数 per = person()文章源自玩技e族-https://www.playezu.com/26200.html
语法: def __ init__(self,arg1,arg2,...): 函数体
说明:
1、之前的写法中并没有显示的定义一个个构造函数,所以系统默认提供了一个无参的构造函数文章源自玩技e族-https://www.playezu.com/26200.html
2、arg1,arg2,...可以自己定义,但是,一般情况下,构造函数的形参列表和成员变量有关构造文章源自玩技e族-https://www.playezu.com/26200.html
3、函数的特点:创建对象;给对象的成员变量赋值文章源自玩技e族-https://www.playezu.com/26200.html
构造函数和成员函数之间的区别:
1、成员函数的函数名可以自定义,但是,构造函数的函数名是固定的__init__文章源自玩技e族-https://www.playezu.com/26200.html
2、成员函数需要被手动调用,但是,构造函数在创建对象的过程中是自动被调用的文章源自玩技e族-https://www.playezu.com/26200.html
3、对于同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次文章源自玩技e族-https://www.playezu.com/26200.html
#1.构造函数被调用
class check():
#成员变量
num1 = 0
s1 = ""
#成员方法
def show(self):
print("showing")
#构造函数
def __init__(self):
print("构造函数被执行了")
c = check() #构造函数被执行了
c.show() #showing
#2.给构造函数添加参数
class check1():
#成员变量
num1 = 0
s1 = ""
#成员方法
def show(self):
print("showing")
#构造函数
def __init__(self,*s): #设置不定长参数
print("构造函数被执行了~~~")
#注意1:当在类中定义了构造函数,并且给构造函数设置了参数,系统将不再提供无参的构造函数
#在创建对象的时候,注意参数的匹配问题
#注意2:在同一个类中,构造函数只能出现一次
c1 = check1(10,20) #构造函数被执行了~~~
c1 = check1() #构造函数被执行了~~~
#3.构造函数的作用
class check2():
#成员变量
num1 = 0
s1 = ""
#成员方法
def show(self):
print("showing")
#构造函数
#构造函数的形参列表一般和成员变量有关【主要给成员变量赋值】
def __init__(self,n,s):
print(n,s)
num1 = n
s1 = s
c2 = check2(10,"abc") #10 abc
print(c2.num1,c2.s1) #0
#4.self的作用:通过self区分成员变量和局部变量
class check3():
#成员变量
num1 = 0
s1 = ""
#成员方法
def show(self):
print("showing")
#构造函数
#构造函数的形参列表一般和成员变量有关【主要给成员变量赋值】
def __init__(self,n,s):
print(n,s)
#此时的num1并不是一个局部变量,而是一个成员变量
self.num1 = n
self.s1 = s
c3 = check3(11,"abc") #11 abc
print(c3.num1,c3.s1) #11 abc
#5.使用self之后:可以省略成员变量的定义
class check4():
#成员方法
def show(self):
print("showing")
#构造函数
def __init__(self,num1,s1):
print(num1,s1)
#定义成员变量,成员变量赋初始值
self.num1 = num1
self.s1 = s1
c4 = check4(12,"abc") #12 abc
print(c4.num1,c4.s1) #12 abc
总结:一般情况下,在一个类中,包含构造函数和成员函数,在构造函数中,定义了成员变量并给成员变量赋值。构造函数的形参与成员变量有关文章源自玩技e族-https://www.playezu.com/26200.html
免责声明:本文内容来自用户上传并发布或网络新闻客户端自媒体,玩技博客仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系删除。

评论