0

我有一段简单的代码,试图file在 Python 中提供便利。

class File:
    def __init__(this, *args):
        this._file = file(*args)

    def __del__(this):
        this._file.close()

def createCallForwarder(method):
    return lambda obj,*args: method(obj._file, *args)

_dict = file.__dict__
for (k,v) in zip(_dict.keys(), _dict.values()):
    if not (k.startswith('__') and k.endswith('__')):
        if v.__class__.__name__ == 'method_descriptor':
            File.__dict__[k] = createCallForwarder(v)

# get the repr method
File.__repr__ = createCallForwarder(dict_proxy['__repr__'])

如果我更改File为继承自object,它不会让我分配方法。

为什么不一样?

4

2 回答 2

4

您根本不应该__dict__直接访问。

使用一种__getattr__方法来代理对底层self._file对象的调用:

class File(object):
    def __init__(self, *args):
        self._file = open(*args)

    def __getattr__(self, name):
        return getattr(self._file, name)

我还将代码切换为最佳实践;使用self代替this和使用open()代替file()

对于新式对象(继承自object),用于setattr()设置任意属性。但是,不需要使用呼叫转发器包装器。您也可以采用绑定方法self._file并将其直接设置为self

class File(object):
    def __init__(self, *args):
        self._file = open(*args)
        for name in dir(self._file):
            setattr(self, name, getattr(self._file, name))

如果你想要的只是一个在垃圾收集时自动关闭的文件对象,那么你就白费了很多麻烦。Python 文件对象已经有一个__del__处理程序可以做到这一点。它只是没有作为显式__del__函数公开,而是 C 实现使用在释放时调用的释放函数close_the_file(f)

然而,最佳实践是使用文件对象作为上下文管理器,使用以下with语句

with open(somefilename) as fileobj:
    # do all sorts with fileobj

# here, fileobj will have been closed automatically.

引用file.close()文档

从 Python 2.5 开始,如果使用 with 语句,可以避免显式调用此方法。例如,下面的代码会在块退出时自动关闭f :with

from __future__ import with_statement # This isn't required in Python 2.6

with open("hello.txt") as f:
    for line in f:
        print line,
于 2013-09-28T16:52:18.850 回答
0

我只是想获得一个自行关闭的 File 对象

使用with statementwhich 将(除其他外)为您关闭文件:

with open('somefile.txt') as the_file:
   for line in the_file:
      # do something with line

# Once outside the with block, the file is automatically closed
print('somefile.txt is closed here') 
于 2013-09-28T16:58:23.113 回答