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-directional-programming/ および/またはhttp://www.tutorialspoint.com/python/python_classes_objects.htm

クラスを作成してインスタンス化すると (mywordnet=WordNet(somegraph) を使用)、mywordnet インスタンスを何度でも再利用できます。自分自身に設定した各変数。WordNet では、そのインスタンスに格納されます。たとえば、mywordnet のいずれかのメソッドを呼び出すと、self.graph は常に使用可能になります。self.graph に格納しない場合は、それを必要とする各メソッド (関数) でパラメーターとして指定する必要があります。とにかくこれらのメソッド呼び出しのすべてが同じグラフを必要とする場合、これは面倒です。

別の見方をすると、self で設定したすべてのものです。Wordnet の特定のインスタンスの一種の構成と見なすことができます。これは、Wordnet の動作に影響を与えます。たとえば、それぞれが異なるグラフでインスタンス化された 2 つの 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) ため、単なるスタンドアロン関数にすることができます。

また、他のコードに見られる特異性も示しています。2 つの引数 ( 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

あなたにとって非常に役立つことの 1 つは、優れたビジュアル デバッガーです。Winpdbと呼ばれる Python 用の素晴らしい無料のものがあります。商用製品の IntelliJ IDEA/PyCharm、Komodo IDE、WingIDE、および Visual Studio (Python ツール アドインを使用) にも優れたデバッガーがあります。おそらく他にもいくつかあります。

これらのデバッガーのいずれかをセットアップし、その下でコードを実行することを強くお勧めします。コードを 1 行ずつ実行し、すべての変数とオブジェクトで何が起こるかを確認できます。

本物のプログラマーはデバッガーを必要としない、または使うべきではないと言う人がいるかもしれません。それらに耳を傾けないでください。優れたデバッガーは、新しい言語を学習したり、コードに慣れたりするのに役立つ最高のツールの 1 つです。

于 2013-06-21T09:51:50.800 に答える