相关疑难解决方法(0)

解释Python的'__enter __'和'__exit__'

我在某人的代码中看到了这个.这是什么意思?

    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)

python oop with-statement

314
推荐指数
6
解决办法
21万
查看次数

del MyClass不调用object .__ del __()

我有一个打开文件写作的类.在我的析构函数中,我调用关闭文件的函数:

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__()被召唤?

python destructor

6
推荐指数
2
解决办法
6188
查看次数

如何以可靠的方式使用__del__?

我了解到,蟒蛇 没有 保证的是__del__当一个对象被删除时调用.换句话说,del x 并不一定调用析构函数x.__del__().

如果我想确保正确的对象清理,我应该使用上下文管理器(在with语句中).

我知道这很愚蠢,但出于几个原因(请不要问为什么)我与Python 2.4绑定了系统; 因此上下文管理器是不可能的(它们是在Python 2.5中引入的)

所以我需要一个替代解决方案,因此我的问题是:是否有可以帮助我__del__可靠使用的最佳实践?我正在思考"如果python提供这样的功能,必须有一种方法可以有效地使用它(我只是愚蠢地弄清楚如何)",,,

或者我只是天真,应该忘记__del__并继续采用完全不同的方法?

python destructor python-2.4

6
推荐指数
2
解决办法
1385
查看次数

用Python进行资源获取的初始化

我是Python的新手。我来自C ++。

在一些代码审查中,我有几个同龄人希望我将事情从initdel转移到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资源已发布,对吗?

python raii

5
推荐指数
1
解决办法
110
查看次数

构造函数和析构函数如何工作?

我正在尝试理解这段代码:

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)

python destructor class

3
推荐指数
2
解决办法
8528
查看次数

Python __del__不能作为析构函数使用?

经过多次检查后,我确实发现了有关该主题的不一致信息.

在某些情况下,我确实发现__init__ and __del__python等同于构造函数和析构函数.这似乎是真的__init__,因为我看到它在创建类时被调用; 但__del__永远不会被调用,当程序结束.

在其他情况下,我确实发现这__del__很糟糕,你必须手动解除分配所有内容.

现在,问题是:哪个是哪个?因为使用unittest.TestCase类,当我调用__del__它时永远不会被调用.可悲的是我无法使用拆卸,因为我需要在测试运行之前启动一个进程,并在完成测试后结束它

python

2
推荐指数
1
解决办法
4292
查看次数

如果删除包含另一个对象的对象会发生什么?

如果我有

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?也会被删吗?

python

2
推荐指数
1
解决办法
54
查看次数

Python:了解对象__del__方法

任何人都可以形容我为什么这段代码会打印'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

1
推荐指数
1
解决办法
256
查看次数

我是否需要在 Python 中为资源包装器实现 Dispose 模式

如果我要在 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 resource-leak

0
推荐指数
1
解决办法
853
查看次数

如何保证ctrl-c退出程序时调用__del__函数?

在我的Python程序中,我创建了一个自定义对象。通过接收 CTRL-C 信号退出该程序。但是,__del__程序退出时不会调用该函数。当程序退出时,该程序创建的所有对象都应该被删除,但是为什么该__del__函数没有被调用呢?现在,为了进行一些清理,我决定进行atexit模块。还有更优雅的方法吗?实际上,我想用它RAII in C++来管理我的 python 对象,我可以这样做吗?

python

-2
推荐指数
1
解决办法
1189
查看次数