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对象?相关推荐

  1. python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...

    前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好?  如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...

  2. python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器

    在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...

  3. 类和对象_月隐学python第15课

    目录 1 ⾯向对象的思想 2. 类和对象 2.1 类和对象的概念 2.2 类的定义​ 2.3 成员⽅法 2.4 对象的创建 2.5 成员属性 3 构造和析构 3.1 构造⽅法 3.2 析构⽅法 3.3 ...

  4. 怎么用python表白_如何正确使用Python进行表白?这是个值得思考的问题!

    提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是"单身狗", 如何正确 ...

  5. python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象

    第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...

  6. 怎么用python表白_如何正确使用Python进行表白

    原标题:如何正确使用Python进行表白 提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是 ...

  7. python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码

    我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...

  8. C++阶段03笔记02【类和对象(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载、继承、多态)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 1.内存分区模型 2.引用 3.函数提高 4.类和对象 4.1.封装 4.1.1.封装的意义 --实例1:设计圆类 --实例2: ...

  9. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

  10. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用

    作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...

最新文章

  1. CentOS中Mysql常用操作
  2. BLE Mesh(2)—— 基本术语及含义
  3. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
  4. opencv8-图像模糊
  5. css 字体倾斜_css笔记3(文本,列表,背景声明)
  6. bootstrap----表格
  7. Shell 反引号、$() 和 ${} 的区别
  8. 炼数成金数据分析课程---10、python中如何画图
  9. AD学习之旅(9)— 新建PCB封装库
  10. idea配置java环境视频教程_【IDEA】JavaWeb教程--环境搭建
  11. 千亿数仓第四章(指标计算_订单分析地域、分类维度分析业务开发)
  12. 薛兆丰·北大经济学课
  13. 修真院教学模式三大阶段之真实项目
  14. 【蓝桥杯集训·每日一题】AcWing 3777. 砖块
  15. html可识别的字体,7款有用的工具来识别字体
  16. 编程马拉松(英语:hackathon,又译为黑客松)
  17. c语言编程学多久,丰城c语言编程学习,丰城学c语言编程的学校,丰城学c语言编程一般要多久才能学会...
  18. 万能播放器KMPlayer
  19. 实现网站短信验证功能
  20. maya python插件_Maya动画批量重定向插件及Python开发插件笔记

热门文章

  1. 大数据平台应用 17 个关键技术处理
  2. 在线SEO外链工具源代码
  3. 价量分析.成交量判断多空头.用跌减涨增量法买股票.成交量识庄家
  4. 关于GraphEasy的简单捣腾
  5. 63 岁工程师的退休生活:开发一款计算器应用,22 天获 56800 下载!
  6. 中点画线算法画直线----计算机图形学
  7. MATLAB中文显示乱码如何解决
  8. Snapshot使用
  9. 【Keil MDK】(一)Keil MDK 5.28 的下载、安装、破解
  10. SQL删除重复数据,仅保留(最新/有效的)一条数据