在 Python3中,预定义的清理行为,指的是在程序运行期间,当特定事件发生时自动执行的资源清理操作。
本文简单来学习一下 Python3 中预定义的清理行为。
下面的示例展示了尝试打开一个文件,然后把内容打印到屏幕上:
#!/usr/bin/env python3
for line in open("file.txt"):
print(line, end="")
以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭,也就是资源没有释放。
关键词 with 语句,就可以保证诸如文件之类的对象在使用完之后,一定会正确的执行他的清理方法。python中预定义的清理行为就是为了解决诸如此类的问题的:
#!/usr/bin/env python3
with open("file.txt") as fd:
for line in fd:
print(line, end="")
一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。
with语句可创建一个上下文管理器,在进入和退出代码块时自动执行特定操作。文件操作就是常见的例子,使用 with语句打开文件,在代码块结束时文件会自动关闭。
注意:上下文管理器是 Python中用于管理资源(如文件、网络连接、锁等)的一种优雅机制,它可以确保资源在使用后被正确释放,即使在处理过程中发生异常也是如此。
例如如下示例,在运行结束后文件会被自动关闭:
#!/usr/bin/env python3
with open("file.txt", 'w') as fd:
fd.write('Hello world!')
#离开 with代码块后,文件会自动关闭
try...finally 语句能确保无论 try块里面是否发生异常,finally块中的代码都会被执行。这在需要释放资源(例如,关闭文件,数据库连接等等)时很有用。
#!/usr/bin/env python3
file = None
try:
file = open("file.txt", 'r')
content = file.read()
print(content)
finally:
if file:
file.close()
Python 的垃圾回收机制,会自动回收不再使用的对象所占用的内存。
当一个对象的引用次数变为 0 时,即没有任何变量引用该对象,Python 的垃圾回收器会自动回收该对象的内存。例如如下示例:
#!/usr/bin/env python3
a = [1, 2, 3] #创建一个列表对象
b = a #增加引用计数
del a #减少引用计数
del b #引用计数变为 0,对象可能会被垃圾回收
类可以定义 __del__方法,当对象被销毁时,这个方法会被调用。不过要谨慎使用 __del__方法,因为它的执行时间并不确定。
#!/usr/bin/env python3
class myclass:
def __init__(self):
print("Object created")
def __del__(self):
print("Object destroyed")
obj = MyClass()
del obj #可能会触发 __del__方法
在 Python中,可以通过 signal模块处理系统信号,例如,在程序接收到SIGTERM信号时执行清理操作。
#!/usr/bin/env python3
import signal
import sys
def signal_handler(sig, frame):
print("You pressed Ctrl+C! Clearnning up...")
#在这里添加清理代码
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
print("Press Ctrl+C to exit")
while True:
pass
运行后如下,当按下 Ctrl+C中断快捷键时,也就是程序接收到 SIGTERM
信号时执行清理操作。
上述这些机制让 Python 能够有效地管理资源,确保在程序运行结束或者发生异常时进行必要的清理工作。