我在某人的代码中看到了这个.这是什么意思?
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
Run Code Online (Sandbox Code Playgroud)
from __future__ import with_statement#for python2.5
class a(object):
def __enter__(self):
print 'sss'
return 'sss111'
def __exit__(self ,type, value, traceback):
print 'ok'
return False
with a() as s:
print s
print s
Run Code Online (Sandbox Code Playgroud) 我有一个打开文件写作的类.在我的析构函数中,我调用关闭文件的函数:
class MyClass:
def __del__(self):
self.close()
def close(self):
if self.__fileHandle__ is not None:
self.__fileHandle__.close()
Run Code Online (Sandbox Code Playgroud)
但当我用以下代码删除对象时:
myobj = MyClass()
myobj.open()
del myobj
Run Code Online (Sandbox Code Playgroud)
如果我尝试重新实例化该对象,我会收到一个值错误:
ValueError: The file 'filename' is already opened. Please close it before reopening in write mode.
Run Code Online (Sandbox Code Playgroud)
而如果我myobj.close()之前打电话,del myobj我就不会遇到这个问题.那么为什么不__del__()被召唤?
我了解到,蟒蛇并 没有 保证的是__del__当一个对象被删除时调用.换句话说,del x 并不一定调用析构函数x.__del__().
如果我想确保正确的对象清理,我应该使用上下文管理器(在with语句中).
我知道这很愚蠢,但出于几个原因(请不要问为什么)我与Python 2.4绑定了系统; 因此上下文管理器是不可能的(它们是在Python 2.5中引入的)
所以我需要一个替代解决方案,因此我的问题是:是否有可以帮助我__del__可靠使用的最佳实践?我正在思考"如果python提供这样的功能,必须有一种方法可以有效地使用它(我只是愚蠢地弄清楚如何)",,,
或者我只是天真,应该忘记__del__并继续采用完全不同的方法?
我是Python的新手。我来自C ++。
在一些代码审查中,我有几个同龄人希望我将事情从init和del转移到start和stop方法。在大多数情况下,这与数十年来使用C ++的RAII背道而驰。
https://zh.wikipedia.org/wiki/Resource_acquisition_is_initialization
RAII在Python中不是问题吗?不是吗
毕竟,我们可以抛出异常,并且我们想在这样做时释放资源,不是吗?
如果不是这样。有人可以提供一些有关为什么事情做得不同的见解吗?有我不懂的语言功能吗?
如果我有:
class Poop:
def __init__:
# Get some Windows Resource
def __del__:
#Release some Windows Resource
def foo():
poop = Poop()
raise Exception("Poop happens")
Run Code Online (Sandbox Code Playgroud)
Windows资源已发布,对吗?
我正在尝试理解这段代码:
class Person:
'''Represents a person '''
population = 0
def __init__(self,name):
//some statements and population += 1
def __del__(self):
//some statements and population -= 1
def sayHi(self):
'''grettings from person'''
print 'Hi My name is %s' % self.name
def howMany(self):
'''Prints the current population'''
if Person.population == 1:
print 'i am the only one here'
else:
print 'There are still %d guyz left ' % Person.population
rohan = Person('Rohan')
rohan.sayHi()
rohan.howMany()
sanju = Person('Sanjivi')
sanju.howMany()
del rohan # am …Run Code Online (Sandbox Code Playgroud) 经过多次检查后,我确实发现了有关该主题的不一致信息.
在某些情况下,我确实发现__init__ and __del__python等同于构造函数和析构函数.这似乎是真的__init__,因为我看到它在创建类时被调用; 但__del__永远不会被调用,当程序结束.
在其他情况下,我确实发现这__del__很糟糕,你必须手动解除分配所有内容.
现在,问题是:哪个是哪个?因为使用unittest.TestCase类,当我调用__del__它时永远不会被调用.可悲的是我无法使用拆卸,因为我需要在测试运行之前启动一个进程,并在完成测试后结束它
如果我有
class MyClass:
def __init__(self, object):
self.object = object
some_other_object = SomeOtherObject()
myclass = MyClass(some_other_object)
del myclass
Run Code Online (Sandbox Code Playgroud)
会发生什么some_other_object?也会被删吗?
任何人都可以形容我为什么这段代码会打印'2 1 0完成'而不是预期输出'0 1 2完成'?据我所知,我们在列表推导过程中创建了一些匿名变量,并且使用filo原理对列表理解无法结束进行垃圾收集.但是,它们仍然在列表aa中引用,不是吗?为什么第二个'del a' 在这种情况下不会调用del magic方法?
class A:
def __init__(self, name):
self.name = name
def __del__(self):
print self.name,
aa = [A(str(i)) for i in range(3)]
for a in aa:
del a
print 'done'
Run Code Online (Sandbox Code Playgroud)
还有,高级问题.请查看http://codepad.org/niaUzGEy 为什么有5份副本,3份副本?这不是一份副本吗?为什么5或3?不知道,那就是为什么要问它;)谢谢你的时间!
如果我要在 Python 中实现一个安全的资源包装器,我是否需要像 C# 一样实现Dispose 模式?
这是我的意思的演示实现:
class ResourceWrapper:
def __init__(self):
self._python_resource = ... # A Python object that manages some resources.
self._external_resource = _allocate_resource() # A resource handle to an external resource.
self._is_closed = False # Whether the object has been closed.
def __del__(self):
self._close(manual_close=False) # Called by GC.
def close(self):
self._close(manual_close=True) # Called by user to free resource early.
def _close(self, manual_close):
if not self._is_closed: # Don’t want a resource to be closed more than once. …Run Code Online (Sandbox Code Playgroud) 在我的Python程序中,我创建了一个自定义对象。通过接收 CTRL-C 信号退出该程序。但是,__del__程序退出时不会调用该函数。当程序退出时,该程序创建的所有对象都应该被删除,但是为什么该__del__函数没有被调用呢?现在,为了进行一些清理,我决定进行atexit模块。还有更优雅的方法吗?实际上,我想用它RAII in C++来管理我的 python 对象,我可以这样做吗?