181

ファイル名を受け取り、ファイルを開き、データを解析するコードを書いています。これを授業でやりたい。次のコードが機能します。

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None

        def parse_file():
            #do some parsing
            self.stat1 = result_from_parse1
            self.stat2 = result_from_parse2
            self.stat3 = result_from_parse3
            self.stat4 = result_from_parse4
            self.stat5 = result_from_parse5

        parse_file()

__init__ただし、すべての解析機構をクラスの関数のスコープに入れる必要があります。この簡略化されたコードでは問題ないように見えますが、関数parse_fileにはかなりのレベルのインデントもあります。parse_file()関数を以下のようなクラス関数として定義することをお勧めします。

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        parse_file()

    def parse_file():
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

もちろん、関数parse_file()は関数のスコープ内にないため、このコードは機能しません__init__。そのクラス内からクラス関数を呼び出す方法はあり__init__ますか? それとも、これについて間違った方法で考えていますか?

4

6 に答える 6

252

この方法で関数を呼び出します。

self.parse_file()

parse_file()また、次のように関数を定義する必要があります。

def parse_file(self):

メソッドは、parse_file呼び出し時にオブジェクトにバインドする必要があります (静的メソッドではないため)。これは、オブジェクトのインスタンスで関数を呼び出すことによって行われます。この場合、インスタンスはself.

于 2012-09-28T19:45:30.300 に答える
45

私が間違っていなければ、両方の関数がクラスの一部であるため、次のように使用する必要があります。

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        self.parse_file()

    def parse_file(self):
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

あなたの行を置き換えます:

parse_file() 

と:

self.parse_file()
于 2012-09-28T19:45:59.360 に答える
15

どうですか:

class MyClass(object):
    def __init__(self, filename):
        self.filename = filename 
        self.stats = parse_file(filename)

def parse_file(filename):
    #do some parsing
    return results_from_parse

ところで、stat1stat2などの名前の変数がある場合、状況はタプルを求めています: stats = (...).

parse_fileタプルを返して、タプルを に格納し ますself.stats

次に、たとえば、 で呼び出されていたものにアクセスできstat3ますself.stats[2]

于 2012-09-28T19:45:50.170 に答える
1

次のように parse_file を宣言する必要があります。def parse_file(self). 「self」パラメーターはほとんどの言語で隠しパラメーターですが、Python ではそうではありません。クラスに属するすべてのメソッドの定義に追加する必要があります。次に、クラス内の任意のメソッドから関数を呼び出すことができますself.parse_file

最終的なプログラムは次のようになります。

class MyClass():
  def __init__(self, filename):
      self.filename = filename 

      self.stat1 = None
      self.stat2 = None
      self.stat3 = None
      self.stat4 = None
      self.stat5 = None
      self.parse_file()

  def parse_file(self):
      #do some parsing
      self.stat1 = result_from_parse1
      self.stat2 = result_from_parse2
      self.stat3 = result_from_parse3
      self.stat4 = result_from_parse4
      self.stat5 = result_from_parse5
于 2012-09-28T19:47:30.563 に答える
0

では、引数parse_fileを取りselfます (のように__init__)。他に必要なコンテキストがある場合は、通常どおり追加の引数として渡します。

于 2012-09-28T19:47:06.593 に答える
-16

あなたの問題は、実際にはinit関数を正しくインデントしていないことにあると思います。

class MyClass():
     def __init__(self, filename):
          pass

     def parse_file():
          pass
于 2012-09-28T19:44:59.067 に答える