python如何释放对象_如何正确清理Python对象?
class Package:
def __init__(self):
self.files = []
# ...
def __del__(self):
for file in self.files:
os.unlink(file)
__del__(self)失败,并出现AttributeError异常。 我了解在调用__del__()时, Python不保证 “全局变量”(在这种情况下是否存在成员数据__del__()存在。 如果是这种情况,并且这是导致异常的原因,那么如何确保对象正确销毁?
#1楼
我认为问题可能出在__init__如果代码多于所示?
即使未正确执行__init__或引发异常,也会调用__del__ 。
#2楼
@contextlib.contextmanager
def packageResource():
class Package:
...
package = Package()
yield package
package.cleanup()
另外,尽管可能不如Pythonic,但是您可以覆盖Package.__new__ :
class Package(object):
def __new__(cls, *args, **kwargs):
@contextlib.contextmanager
def packageResource():
# adapt arguments if superclass takes some!
package = super(Package, cls).__new__(cls)
package.__init__(*args, **kwargs)
yield package
package.cleanup()
def __init__(self, *args, **kwargs):
...
并with Package(...) as package 。
为了contextlib.closing ,请将您的清理函数命名为close并使用contextlib.closing ,在这种情况下,您可以通过with contextlib.closing(Package(...))使用未修改的Package类,也可以将其__new__重写为更简单的方法
class Package(object):
def __new__(cls, *args, **kwargs):
package = super(Package, cls).__new__(cls)
package.__init__(*args, **kwargs)
return contextlib.closing(package)
而且此构造函数是继承的,因此您可以简单地继承,例如
class SubPackage(Package):
def close(self):
pass
#3楼
# package.py
import atexit
import os
class Package:
def __init__(self):
self.files = []
atexit.register(self.cleanup)
def cleanup(self):
print("Running cleanup...")
for file in self.files:
print("Unlinking file: {}".format(file))
# os.unlink(file)
但是,请记住,这将保留所有创建的Package实例,直到终止Python。
使用上面的代码的演示保存为package.py :
$ python
>>> from package import *
>>> p = Package()
>>> q = Package()
>>> q.files = ['a', 'b', 'c']
>>> quit()
Running cleanup...
Unlinking file: a
Unlinking file: b
Unlinking file: c
Running cleanup...
#4楼
#5楼
这是一个最小的工作框架:
class SkeletonFixture:
def __init__(self):
pass
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
pass
def method(self):
pass
with SkeletonFixture() as fixture:
fixture.method()
重要提示: 返回自我
如果您像我一样,却忽略了return self部分( 克林特·米勒的正确答案的一部分 ),那么您将盯着这个废话:
Traceback (most recent call last):
File "tests/simplestpossible.py", line 17, in
fixture.method()
AttributeError: 'NoneType' object has no attribute 'method'
我花了半天时间。 希望它能帮助下一个人。
python如何释放对象_如何正确清理Python对象?相关推荐
- python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...
前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好? 如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...
- python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器
在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...
- 类和对象_月隐学python第15课
目录 1 ⾯向对象的思想 2. 类和对象 2.1 类和对象的概念 2.2 类的定义 2.3 成员⽅法 2.4 对象的创建 2.5 成员属性 3 构造和析构 3.1 构造⽅法 3.2 析构⽅法 3.3 ...
- 怎么用python表白_如何正确使用Python进行表白?这是个值得思考的问题!
提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是"单身狗", 如何正确 ...
- python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象
第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...
- 怎么用python表白_如何正确使用Python进行表白
原标题:如何正确使用Python进行表白 提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是 ...
- python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码
我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...
- C++阶段03笔记02【类和对象(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载、继承、多态)】
C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 1.内存分区模型 2.引用 3.函数提高 4.类和对象 4.1.封装 4.1.1.封装的意义 --实例1:设计圆类 --实例2: ...
- python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解
导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...
- c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用
作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...
最新文章
- CentOS中Mysql常用操作
- BLE Mesh(2)—— 基本术语及含义
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
- opencv8-图像模糊
- css 字体倾斜_css笔记3(文本,列表,背景声明)
- bootstrap----表格
- Shell 反引号、$() 和 ${} 的区别
- 炼数成金数据分析课程---10、python中如何画图
- AD学习之旅(9)— 新建PCB封装库
- idea配置java环境视频教程_【IDEA】JavaWeb教程--环境搭建
- 千亿数仓第四章(指标计算_订单分析地域、分类维度分析业务开发)
- 薛兆丰·北大经济学课
- 修真院教学模式三大阶段之真实项目
- 【蓝桥杯集训·每日一题】AcWing 3777. 砖块
- html可识别的字体,7款有用的工具来识别字体
- 编程马拉松(英语:hackathon,又译为黑客松)
- c语言编程学多久,丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会...
- 万能播放器KMPlayer
- 实现网站短信验证功能
- maya python插件_Maya动画批量重定向插件及Python开发插件笔记