5

我有一个旧代码调用class TiffFile(file). python3的调用方式是什么?

我试图在 python2 中替换以下内容:

class TiffFile(file):
    def __init__(self, path):
        file.__init__(self, path, 'r+b')

通过这个在python3中:

class TiffFile(RawIOBase):
    def __init__(self, path):
        super(TiffFile, self).__init__(path, 'r+b')

但现在我得到TypeError: object.__init__() takes no parameters

4

1 回答 1

5

RawIOBase.__init__不接受任何参数,这就是你的错误所在。

您的TiffFile实现也继承file了它不是一个类,而是一个构造函数,因此您的 Python 2 实现是非惯用的,甚至有人可能声称它是错误的。您应该使用open代替file,并且在类上下文中,您应该使用io模块类进行输入和输出。

您可以像在 Python 2.7 中open一样使用返回文件对象以供使用,也可以在Python 2Python 3中使用来访问文件流,就像使用.fileio.FileIOopen

所以你的实现会更像:

import io

class TiffFile(io.FileIO):
    def __init__(self, name, mode='r+b', *args, **kwargs):
        super(TiffFile, self).__init__(name, mode, *args, **kwargs)

这应该适用于所有当前支持的 Python 版本,并允许您使用与旧实现相同的接口,同时更正确和可移植。

您实际上是否r+b用于在 Windows 上以读写二进制模式打开文件?rb如果您不写入文件,而只是读取 TIFF 数据,您可能应该使用模式。rb将以二进制模式打开文件以进行只读。附加+的设置文件以读写模式打开。

于 2017-12-15T20:05:45.960 回答