__init__内でクラス関数を呼び出す


132

ファイル名を取得し、ファイルを開き、データを解析するコードを書いています。クラスでこれをしたいのですが。次のコードは機能します。

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__そのクラス内からクラス関数を呼び出す方法はありますか?それとも私はこれを間違った方法で考えていますか?


コード例に「stat」の5つのバージョンが必要な理由は何ですか?1つしかない場合は読みやすくなります。
465b

回答:


183

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

self.parse_file()

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

def parse_file(self):

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


はい!これはまさに私が探していたものでした。ありがとうございました!
PythonJin 2012

33

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

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()

それを使用しなければならない理由を説明していただけself.parse_file()ませんparse_file()か?
ivanleoncz 2017

部分的に初期化されたオブジェクトがないように、@ paritoshsinghを関数のdef parse_file(self):下にネスト__init__しないでください。
donrondadon

@ivanleoncz parse_fileはインスタンスメソッドであるため、参照オブジェクトを使用して呼び出す必要があります。
パリトッシュシン2018

@rongこのコードが古く、解析ファイルを外部から設定できないようにする場合は、ネストする必要があります。
パリトッシュシン2018

12

どうですか:

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]


私は同意します。自分が割り当てているクラス変数がいくつかあることを示すために、self.stat1からself.stat5をそこに配置しました。実際のコードでは、よりエレガントな解決策があります。
PythonJin 2012

parse_file関数をMyClassオブジェクトのメソッドにしたい場合、これをどのように変更すべきですか?どこselfが必要でしょうか?
n1k31t4 2018


0

このように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

-13

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

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

     def parse_file():
          pass

どちらもあなたのコードではありません。あなたは入れない限り@staticmethodの上にデコレータを parse_file
rantanplan

少なくともselfparse_fileメソッドに不足しているものを追加します。
rantanplan 2012

おっと、申し訳ありませんが、 "class MyClass():"行の下に追加のインデント層があったはずです。上記で修正しましたが、問題は変わりません。
PythonJin 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.