1

我有一个程序,它读入一个文本文件并取出必要的变量以序列化为海龟格式并存储在 RDF 图中。我的代码很粗糙,有人建议我把它分成函数。由于我是 Python 新手,所以我不知道该怎么做。下面是该程序的一些功能。

我对什么时候应该将参数传递给函数以及什么时候应该初始化它们感到困惑self.这是我的一些函数。如果我能解释我做错了什么,那就太好了。

#!/usr/bin/env python

from rdflib import URIRef, Graph
from StringIO import StringIO
import subprocess as sub

class Wordnet():

    def __init__(self, graph):
        self.graph = Graph()

    def process_file(self, file):
        file = open("new_2.txt", "r")
        return file

    def line_for_loop(self, file):
        for line in file:
            self.split_pointer_part()
            self.split_word_part()
            self.split_gloss_part()
            self.process_lex_filenum()
            self.process_synset_offset()
            +more functions............
            self.print_graph()

    def split_pointer_part(self, before_at, after_at, line):
        before_at, after_at = line.split('@', 1)
        return before_at, after_at

    def get_num_words(self, word_part, num_words):
        """ 1 as default, may want 0 as an invalid case """
        """ do if else statements on l3 variable """
        if word_part[3] == '0a':
            num_words = 10
        else:
            num_words = int(word_part[3])
        return num_words

    def get_pointers_list(self, pointers, after_at, num_pointers, pointerList):
        pointers = after_at.split()[0:0 +4 * num_pointers:4]
        pointerList = iter(pointers)
        return pointerList

    ............code to create triples for graph...............

    def print_graph(self):
        print graph.serialize(format='nt')

    def main():
        wordnet = Wordnet()
        my_file = wordnet.process_file()
        wordnet.line_for_loop(my_file)

if __name__ == "__main__":
    main()
4

3 回答 3

3

你的问题主要是关于什么是面向对象编程的问题。我将尝试快速解释,但我建议阅读有关它的适当教程,例如 http://www.voidspace.org.uk/python/articles/OOP.shtml http://net.tutsplus.com/tutorials/python- tutorials/python-from-scratch-object-oriented-programming/ 和/或http://www.tutorialspoint.com/python/python_classes_objects.htm

当您创建一个类并实例化它时(使用 mywordnet=WordNet(somegraph)),您可以多次恢复 mywordnet 实例。您在 self.xml 上设置的每个变量。在 WordNet 中,存储在该实例中。因此,例如,如果您调用 mywordnet 的任何方法,self.graph 始终可用。如果您不将其存储在 self.graph 中,则需要在需要它的每个方法(函数)中将其指定为参数。如果所有这些方法调用都需要相同的图表,那将是乏味的。

所以换个角度看:你用自我设定的一切。可以看作是针对特定 Wordnet 实例的一种配置。它影响 Wordnet 的行为。例如,您可以有两个 Wordnet 实例,每个实例都使用不同的图形进行实例化,但所有其他功能都相同。这样,您可以选择打印到哪个图表,具体取决于您使用的 Wordnet 实例,但其他一切都保持不变。

我希望这对你有所帮助。

于 2013-06-21T09:26:11.733 回答
0

首先,我建议你自己弄清楚基本的功能分解——根本不用担心写一个类。

例如,

def split_pointer_part(self, before_at, after_at, line):
    before_at, after_at = line.split('@', 1)
    return before_at, after_at

不涉及任何实例变量(它从不引用self),所以它可以只是一个独立的函数。

它还表现出我在您的其他代码中看到的一个特点:您传递了两个参数 ( before_at, after_at) 但从不使用它们的值。如果调用者还不知道它们是什么,为什么要传递它们呢?

所以,一个自由函数应该看起来像:

def split_pointer_part(line):
    """get tuple (before @, after @)"""
    return line.split('@', 1)

如果你想把这个函数放在你的类作用域中(这样它就不会污染顶层命名空间,或者只是因为它是一个逻辑分组),如果不使用它,你仍然不需要传递self。您可以将其设为静态方法:

@staticmethod
def split_pointer_part(line):
    """get tuple (before @, after @)"""
    return line.split('@', 1)
于 2013-06-21T09:51:19.047 回答
0

对您非常有帮助的一件事是一个好的可视化调试器。Python 有一个不错的免费软件,叫做Winpdb。在商业产品 IntelliJ IDEA/PyCharm、Komodo IDE、WingIDE 和 Visual Studio(带有 Python 工具插件)中也有出色的调试器。可能还有其他几个。

我强烈建议设置其中一个调试器并在其下运行您的代码。它将让您逐行浏览代码并查看所有变量和对象会发生什么。

您可能会发现有人告诉您真正的程序员不需要或不应该使用调试器。不要听他们的:好的调试器是帮助您学习新语言或熟悉一段代码的最佳工具之一。

于 2013-06-21T09:51:50.800 回答