-
python中析构函数的作用_python 入坑路--析构函数
2020-12-14 22:56:141、什么是析构函数新鲜事物,我喜欢。定义:在实例销毁的时候调用的函数2、玩一玩例子class Dog(object):'''描述狗'''def __init__(self,name):self.name=namedef eat(self,food):print("%s eating %s" %(self.name,...1、什么是析构函数
新鲜事物,我喜欢。
定义:在实例销毁的时候调用的函数
2、玩一玩例子
class Dog(object):
'''
描述狗
'''
def __init__(self,name):
self.name=name
def eat(self,food):
print("%s eating %s" %(self.name,food))
def __del__(self):
print("del ....object,%s 挂了" %self.name)
d=Dog("小犬纯一郎")
del d
#输出
del ....object,小犬纯一郎 挂了
①析构函数什么时候调用呢?
其实每一个对象都是一个应用,就像每一个房间都有门牌号一样, 只要这个对象的引用被清空时,就会自动执行,就像上面的del d,其实python中有自动垃圾回收机制,会定时去的去回收一些被清空的应用,而析构函数就是在引用被清空之后会自动执行
②析构函数的作用?
比如说server端接受很多客户端的连接,当你手动屏蔽你的sever端的时候,这个时候客户端还在正常的连接,如果sever端用类写的,你就可以delete server端的同时,在__del__()写一些东西,说去close掉很多客户端的连接。说白了,析构函数就是做一些程序的收尾工作。
-
解决方案-关于python在析构函数中无法使用open函数
2021-02-23 17:13:15解决方案-关于python在析构函数中无法使用open函数 class Test: def __init__(self): print("__init__") def main(self): print("main") def __del__(self): with open("test.txt", "w") as f: f.write(...解决方案-关于python在析构函数中无法使用open函数
class Test: def __init__(self): print("__init__") def main(self): print("main") def __del__(self): with open("test.txt", "w") as f: f.write("hhhhh") print("__del__") t = Test() t.main()
会报错 NameError: name ‘open’ is not defined
python2没有这个问题
以下列出的一些解决方案和看法,但造成错误的具体/根本原因目前还未知
本文围绕该问题初步探究Python垃圾清理的机制文章目录
解决方案一 try …except …finally
情景: 我的需求是在对象销毁时, 要在文件中进行一个记录
解决: 使用 try...except...finally...
try: # 在Test类中移除open()函数, 实例化对象交由try t = Test() t.main() except Exception as e: print(e) finally: # open()函数交由finally with open("test.txt", "w") as f: f.write("20201214")
解决方案二 转移open()函数
在__del__中无法使用open()函数, 将open()转移到其它对象方法中, 最后在析构函数中关闭
class Test: def __init__(self): print("__init__") def main(self): print("main") self.file = open("test.txt", "w") def __del__(self): self.file.write("helloworld") print("__del__") self.file.close() t = Test() t.main()
解决方案三 使用atexit模块
在百度和必应中搜寻无果, 果然还是google更加强大!
为解决这一问题, 我们可以首先导入atexit模块, 然后将析构操作写入另一个函数中, 最后用atexit.register来注册这个函数. 比如, 以上程序可以改写如下:
import atexit class 存储代理: def __init__(self): atexit.register(self.cleanup) print("开始") def cleanup(self): print("打开文件前") with open("./测试.txt", "w") as 文件: pass print("打开文件后") def __del__(self): pass 代理 = 存储代理()
atexit模块
atexit-允许程序员定义在正常程序终止时执行的多个退出函数。 at exit python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。atexit 按注册的相反顺序执行这些函数; 例如注册A、B、C,在解释器终止时按顺序C,B,A运行。
Note:如果程序是非正常crash,或者通过
os._exit()
退出,注册的退出函数将不会被调用。atexit.register(func, *args, **kargs)
将func作为要在终止时执行的函数。任何要传递给func的可选参数必须作为参数传递给
register()
。可以多次注册相同的函数和参数。当程序退出的时候,按先进后出的顺序调用注册的函数。如果退出函数在执行过程中抛出了异常,atexit会打印异常的信息,并继续执行下一下回调,直到所有退出函数执行完毕,它会重新抛出最后接收到的异常。
一.通过装饰器使用atexit
from atexit import register def main(): print('Do something.') @register def _atexit(): print('Done.') if __name__ == '__main__': main()
输出: Do something
Done
二.非装饰器方式
from atexit import register def main(): print('main') def goodbye(name, adjective): print('Goodbye, %s, it was %s to meet you.' % (name, adjective)) register(goodbye, 'Donny', 'nice') # register(goodbye, adjective='nice', name='Donny') if __name__ == '__main__': main()
输出: main
Goodbye, Donny, it was nice to meet you.文章目录
解决方案五 显式del
class Test: def __init__(self): print("__init__") def __del__(self): with open("xianshi.txt", "w") as f: f.write("ffff") t = Test() del t
基于本例的问题探究
dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
所以, 利用dir()函数, 我想探究在析构函数中到底减少了哪些方法和属性
class Test: def __init__(self): print(dir(__builtins__), len(dir(__builtins__))) print("__init__") def __del__(self): print("---del---") print(dir(__builtins__), len(dir(__builtins__))) print("---del---") with open("test.txt", "w") as f: f.write("ffff") t = Test() # del t
结果分析: 在__init__(self)中, 内建属性和方法有153个, 然而在__del__中只有146个, 减少了7个
我使用集合经行相减后发现, 缺失的内建有
{'quit', 'license', 'credits', 'exit', 'help', 'open', 'copyright'}
在交互式的python中, 内建属性方法有154个
如果上述代码的第14行取消注释, 在析构函数中的内建属性和方法仍然有153个
个人看法
如果手动del对象, 此时python内的资源还健全,要是等到python解释器来清理, 它已经清理了太多资源,所以当执行到一些已清理的资源时便会报错
解决方案六
class Iam(object): def __init__(self): print("I m born") def __del__(self): #"open" function still in __builtins__ f = open("memory_report.txt", "w") f.write("He gone safe") f.close() def write_iam(): print("----") i=Iam() print("====") if __name__ == '__main__': write_iam() print("Script Ends. Now to GC clean memory")
主体程序结束后才调用 Iam类__del__方法,而不是当 i超出 write_iam的作用域时就去立即调用__del__方法。
原理如下:
Python 采用的是引用计数机制为主, 标记-清除和分代收集两种机制为辅的策略。 因此, 当 Python 在超出范围时不会清理它,只有当它的最后一次引用超出范围时, 才会将它清理掉。 -
Python(析构函数)
2017-08-16 22:34:41在Python的对象中,也存在构造函数(__init__)和析构析构函数(__del__)。...在Python中定义下面一个类class A: def __init__(self): print("initialization") def my_print(self): print("my_print")在Python的对象中,也存在构造函数(
__init__
)和析构析构函数(__del__
)。这里简单说一下Python的析构函数的机制。在Python中定义下面一个类
class A: def __init__(self): print("initialization") def my_print(self): print("my_print") def __del__(self): print("delete")
运行时,通过下面这样的赋值:
>>>a1 = A() initialization >>>a2 = a1 >>>a3 = a1
在Python中,如果只对 a1 进行析构
del a1
,那么对象并没有被析构掉,只有将对象和引用都析构,才会调用析构函数。>>>del a1 >>>del a2 >>>del a3 //a1 a2 a3 顺序无要求 delete
如果这里有:
>>>a1 = A() initialization >>>a2 = a1 >>>a3 = a1 >>>a4 = a1.my_print() >>>>del a1 >>>del a2 >>>del a3 delete >>>a4 >>>
这时候 a4 存在,但返回类型为 ‘NoneType’。
-
[转载] Python(析构函数)
2020-12-28 08:30:02参考链接: Python中的析构函数 ...在Python中定义下面一个类 class A: def __init__(self): print("initialization") def my_print(self): print("my_print") def __del__(self): ...在Python的对象中,也存在构造函数(__init__)和析构析构函数(__del__)。这里简单说一下Python的析构函数的机制。
在Python中定义下面一个类
class A:
def __init__(self):
print("initialization")
def my_print(self):
print("my_print")
def __del__(self):
print("delete")
运行时,通过下面这样的赋值:
>>>a1 = A()
initialization
>>>a2 = a1
>>>a3 = a1
在Python中,如果只对 a1 进行析构del a1,那么对象并没有被析构掉,只有将对象和引用都析构,才会调用析构函数。
>>>del a1
>>>del a2
>>>del a3 //a1 a2 a3 顺序无要求
delete
如果这里有:
>>>a1 = A()
initialization
>>>a2 = a1
>>>a3 = a1
>>>a4 = a1.my_print()
>>>>del a1
>>>del a2
>>>del a3
delete
>>>a4
>>>
这时候 a4 存在,但返回类型为 ‘NoneType’。
-
python 析构函数_浅析Python析构函数
2021-01-29 09:19:00Python中有两个特殊的方法, 一个是构造方法__init__, 另一个是析构方法__del__.构造方法__init__,具有初始化的作用,也就是当该类被实例化的时候就会自动执行该函数。那么通常就可以把要先初始化的属性放到这个方法... -
python del函数_在python中安全使用析构函数
2020-12-07 02:56:01逛hacker news的时候看到《Safely using destructors...看了这篇文章差不多清楚了在Python中到底怎样使用析构函数。作者: Eli Bendersky原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructo... -
python析构函数什么时候调用_python析构函数什么时候调用_python之类的构造和析构函数...
2021-03-06 14:19:13构造函数——————— __init__( self )析构函数——————— __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple:def __... -
python中的构造函数_python 构造函数 析构函数
2021-01-29 06:22:08#构造函数是在对象被创建是自动调用的方法,用来完成初始化操作classTest(object):def __init__(self, name):self.name=nameprint('这是构造函数')defsay_hi(self):print('hell, %s' %self.name)def __del__(self):... -
python有析构函数吗_python之类的构造和析构函数
2021-03-06 14:03:36构造函数--------------------- __init__( self )析构函数--------------------- __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class... -
python析构函数
2018-06-11 17:36:34python析构函数 析构函数,这样在类实例所占内存被回收时,系统就会自动调用析构函数。通常,我们会在析构函数中做一些“清理”工作,比如释放资源,关闭连接,或者发送一个网络包到其它服务以告知其状态变化等等。... -
java 析构函数_关于使用 Python 析构函数的正确姿势
2020-11-28 12:22:33戳上方蓝字关注我们吧本文转载自360云计算(订阅号id:hulktalk),经平台同意授权转载。...析构函数是 C++ 中一个非常重要的概念,析构函数 ( destructor ) 与构造函数相反,当对象结束其生命周期,如... -
python析构方法的作用_Python中的析构函数详解
2020-12-08 04:27:49在Python中,析构函数不像在c++中那么需要,因为Python有一个垃圾收集器,可以自动处理内存管理。__del__()方法在Python中称为析构函数方法。当对对象的所有引用都已被删除时即当一个对象被垃圾回收时,将调用该函数... -
gl函数在qt中无法使用_在python中安全使用析构函数
2021-01-19 02:44:08逛hacker news的时候看到《Safely using destructors...看了这篇文章差不多清楚了在Python中到底怎样使用析构函数。作者: Eli Bendersky原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructo... -
python的构造函数和析构函数_简介python中的析构函数与构造函数
2021-02-10 20:53:53构造函数__init__( self )**析构函数__del__( self )**不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple: def __init__( self ):passdef __del... -
在Python中安全使用析构函数
2018-12-07 11:49:27作者: Eli Bendersky 原文链接:https://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python ...在C++中,析构函数是一个非常重要的概念,它们是RAII(resource acquisition i... -
Python教程-析构函数详解
2019-04-02 11:10:40在Python中,析构函数不像在c++中那么需要,因为Python有一个垃圾收集器,可以自动处理内存管理。del()方法在Python中称为析构函数方法。当对对象的所有引用都已被删除时即当一个对象被垃圾回收时,将调用该函数。 ... -
Python解决析构函数__del__()不能使用open方法的问题
2020-12-23 17:39:55Python解决析构函数__del__不能使用open方法的问题 之前默认以为python的open方法用存哪里都没什么区别的,然后昨天直接在"__ del __()"中跑程序时反馈程序报错“Python3 NameError: name ‘open’ is not defined”... -
Python3中的析构函数
2018-10-11 17:12:03析构函数 析构函数:__del__(self) 在程序全部结束时自动结束,当程序无法结束时该函数也不会执行。 执行时间:1.如果该析构函数是全局,则程序结束自动执行 2.如... -
python 析构函数_Python:构造函数和析构函数
2021-01-31 17:34:31python中的特殊方法,其中两个,构造函数和析构函数的作用:比说“__ init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数。那么我们就可以把要先初始化的属性放到这个函数里面。... -
python del函数_浅析Python析构函数
2020-12-07 02:56:05Python中有两个特殊的方法, 一个是构造方法__init__, 另一个是析构方法__del__.构造方法__init__,具有初始化的作用,也就是当该类被实例化的时候就会自动执行该函数。那么通常就可以把要先初始化的属性放到这个方法...