首页 > 解决方案 > 使用 OOP 运行 python 脚本时出错

问题描述

我有一个名为“ infile.bin”的二进制文件。我想制作一个程序并稍微更改 infile (输入文件,每个字节的值加一),然后 make outfile. 为此,我在 python 中制作了以下脚本:

import sys

class assignment():

    def __init__(self, infile, outfile):
        if not infile.endswith('.bin'):
            raise NameError("file should have '.bin' extension")
        self.infile = infile
        self.outfile = outfile

    def read_infile(self):
        with open(self.infile, "rb") as bin_in_file:
            data = bin_in_file.read()
        return data

    def increment_write(self):
        with open(self.outfile, "wb") as bin_out_file:
            bin_out_file.write(bytes(item + 1 for item in data))


infile = sys.argv[1]
outfile = sys.argv[2]
main = assignment(infile, outfile).read_infile()
main2 = assignment(infile, outfile).increment_write()

print main
print main2

使用这个简单的命令运行它

python program.py infile.bin out.bin

但是当我运行脚本时,它给出了这个错误:

Traceback (most recent call last):
  File "program.py", line 24, in <module>
    main2 = assignment(infile, outfile).increment_write()
  File "program.py", line 18, in increment_write
    bin_out_file.write(bytes(item + 1 for item in data))
NameError: global name 'data' is not defined

而且没有“ out.bin”你知道怎么解决吗?

标签: pythonoopcommand-line

解决方案


这就像在 Java(或任何其他 OOP 语言)中调用需要参数的类的构造函数,而不需要任何参数。当然,这是行不通的——但这是你在做的时候所做的assignment().read_infile()——你创建了一个类的新对象assignment,调用不带参数的构造__init__函数(除了self),然后调用read_infile()生成的对象。

因此,您需要从命令行读取文件并将其传递给构造函数:

import sys
...
infile = sys.argv[1]  # refers to the second command-line argument, which would be "infile.bin"
outfile = "some_other_file.bin"
main = assignment(infile, outfile).read_infile()

推荐阅读