首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使Python脚本面向对象

使Python脚本面向对象
EN

Stack Overflow用户
提问于 2009-11-29 01:19:36
回答 3查看 20.1K关注 0票数 27

我正在用Python编写一个应用程序,它将有许多不同的函数,所以从逻辑上讲,我认为最好将我的脚本拆分成不同的模块。目前,我的脚本读入一个文本文件,其中包含已转换为标记和拼写的代码。然后,该脚本将代码重新构造为一个字符串,并在原始代码中的注释所在的位置使用空行。

不过,我在使脚本面向对象时遇到了问题。无论我怎么尝试,我似乎都不能让程序以相同的方式运行,就好像它只是一个脚本文件。理想情况下,我希望有两个脚本文件,其中一个包含清理和重构文件的类和函数。第二个脚本将简单地调用另一个文件中的类中的函数,该文件是作为命令行中的参数给出的。这是我当前的脚本:

代码语言:javascript
复制
import sys

tokenList = open(sys.argv[1], 'r')
cleanedInput = ''
prevLine = 0

for line in tokenList:

    if line.startswith('LINE:'):
        lineNo = int(line.split(':', 1)[1].strip())
        diff = lineNo - prevLine - 1

        if diff == 0:
            cleanedInput += '\n'
        if diff == 1:
            cleanedInput += '\n\n'
        else:
            cleanedInput += '\n' * diff

        prevLine = lineNo
        continue

    cleanedLine = line.split(':', 1)[1].strip()
    cleanedInput += cleanedLine + ' '

print cleanedInput

按照Alex Martelli下面的建议,我现在有了下面的代码,它给出了与我的原始代码相同的输出。

代码语言:javascript
复制
def main():
    tokenList = open(sys.argv[1], 'r')
    cleanedInput = []
    prevLine = 0

    for line in tokenList:

        if line.startswith('LINE:'):
            lineNo = int(line.split(':', 1)[1].strip())
            diff = lineNo - prevLine - 1

            if diff == 0:
                cleanedInput.append('\n')
            if diff == 1:
                cleanedInput.append('\n\n')
            else:
                cleanedInput.append('\n' * diff)

            prevLine = lineNo
            continue

        cleanedLine = line.split(':', 1)[1].strip()
        cleanedInput.append(cleanedLine + ' ')

    print cleanedInput

if __name__ == '__main__':
    main()

不过,我仍然希望将我的代码拆分成多个模块。我的程序中的“清理过的文件”将会有其他的功能在它上面执行,所以一个清理过的文件自然应该是一个独立的类,对吗?

EN

回答 3

Stack Overflow用户

发布于 2009-11-29 01:28:40

当我进行这种特殊的重构时,我通常从第一个文件中的初始转换开始。步骤1:将功能移动到新类中的方法中。步骤2:添加下面的魔术调用,让文件再次像脚本一样运行:

代码语言:javascript
复制
class LineCleaner:

    def cleanFile(filename):
        cleanInput = ""
        prevLine = 0
        for line in open(filename,'r'):         
           <... as in original script ..>

if __name__ == '__main__':
     cleaner = LineCleaner()
     cleaner.cleanFile(sys.argv[1]) 
票数 1
EN

Stack Overflow用户

发布于 2009-11-29 01:39:41

你可以创建一个函数,然后把你所有的逻辑都放在里面。然而,对于完全的“面向对象”,你可以这样做:

ps -您发布的代码在continue行上有一个错误-它总是被执行,最后2行永远不会执行。

代码语言:javascript
复制
class Cleaner:
  def __init__(...):
    ...init logic...
  def Clean(self):
    for line in open(self.tokenList):
      ...cleaning logic...
    return cleanedInput

def main(argv):
  cleaner = Cleaner(argv[1])
  print cleaner.Clean()
  return 0

if '__main__' == __name__:
  sys.exit(main(sys.argv))
票数 0
EN

Stack Overflow用户

发布于 2009-11-29 01:47:01

如果所呈现的代码都是代码,那么就不要添加任何类!

你的代码太简单了!OOP方法会增加不必要的复杂性。

但如果还是不行的话。将所有代码放入函数中。

代码语言:javascript
复制
def parse_tokenized_input(file):
    tokenList = open(file, 'r')
    cleanedInput = ''
    prevLine = 0
    #rest of code

在末尾添加:

代码语言:javascript
复制
if __name__ == '__main__':
    parse_tokenized_input(sys.argv[1])

如果代码工作正常,则将函数的def放入新文件(以及所有需要的导入!)例如:mymodyle.py

您的脚本现在将是:

代码语言:javascript
复制
from mymodule.py import parse_tokenized_input

if __name__ == '__main__':
        parse_tokenized_input(sys.argv[1])

哦,为你的函数和模块想出更好的名字(模块应该有一个通用的名字)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1813117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档