【问题标题】:error in while running a python script with OOP使用 OOP 运行 python 脚本时出错
【发布时间】:2019-05-05 21:33:09
【问题描述】:

我有一个名为“infile.bin”的二进制文件。我想制作一个程序并稍微更改一下infile(输入文件,每个字节的值加一),然后制作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”你知道怎么解决吗?

【问题讨论】:

  • ...实例化类时传递__init__方法中定义的两个参数?
  • 你已经定义了你的构造函数来接受两个参数,但是你没有传递任何参数。您需要为其提供参数。请注意,错误消息可能会令人困惑,因为它说您的构造函数接受三个参数但您只传递了一个,但您必须了解第一个参数 self 是自动为您传递的。请注意,您没有对传递给脚本的参数做任何事情,您负责解析这些参数。
  • @juanpa.arrivillaga 我已经完成了(就像 eddied 问题一样)但得到了同样的错误。
  • 对不起,我不明白。你做了什么究竟?您可以通过其他尝试及其错误消息来编辑您的问题
  • 哦,我明白你添加了什么,但这不是我要说的。同样,您已经定义了 constructor__init__ yo 接受两个参数,但您传递了零个参数。你预计会发生什么?

标签: python oop command-line


【解决方案1】:

这就像在 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()

【讨论】:

  • 我已经按照你说的那样编辑了代码,但它返回 None
  • 好吧,看看你是如何实现read_infile()的。它没有返回任何东西。如果您愿意,您需要在某处添加return 声明。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2018-01-27
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多