1

私は Python でアルゴリズムを作成しましたが、今はそれをもう少しオブジェクト指向にしようとしています。私はオブジェクトとクラスについて十分に理解しており (私が思うに)、Python のクラスの構文をオンラインで読むことに時間を費やしています。ただし、私の質問は非常に基本的なものであり、助けがあれば幸いです。

3 つの定義を含むクラス XML を作成しました。__init__オブジェクトの初期化にも使用しました。

    class XML():

       def __init__(self,f):
          self.f = f


       def xmlToString(self):
           data = self.f.read()
           self.f.close()
           ...
           return station_arr


       def exportArray(self):
           f= open('stations/'+self.STATION+'.txt')
           lines= f.readlines()
           ...
           return phenomena,parameters


       def calcAvg(self):
           split_phenom = self.phenomena.split(';')
           list_of_lists = []
           for e in self.parameters:
              ...
           return phenomena,parameters

次に、main.py でオブジェクトをインスタンス化し、必要なメソッドを次のように呼び出します。

       stations_names ['one', 'two'...]

       for station in stations_names:
           f = open('respond.txt','r')

           xmlStr = ClassXML.XML(f) 
           stations_arr =  xmlStr.xmlToString()


           xmlRead = ClassXML.XML(stations_arr)
           phenomena,parameters = xmlRead.exportArray()

           xmlRetr = ClassXML.XML(phenomena,parameters)
           avg_dict,dict_values = xmlRetr.calcAvg()

私が得るエラーはこれです:

f= open('stations/'+self.station+'.txt')
AttributeError: XML instance has no attribute 'station'

だから私は問題が何であるかを理解しています。変数「ステーション」をクラスに渡す必要がある方法。しかし、init関数に含めようとすると、さまざまなエラーが発生します。

xmlStr = ClassXML.XML(f) 
TypeError: __init__() takes exactly 3 arguments (2 given)

次に、複数のinit関数が必要かもしれないと考えましたが、私が知る限り、これは Python では不可能です。正直なところ、私は問題を処理する方法がよくわかりません。どんなヒントでも役に立ちます。

ありがとう

PS タイトルが私の質問を正しく説明しているかどうかはわかりませんが、適切な言葉が見つかりません!

実装された最終回答

    class XML():

       def __init__(self,f,station):
          self.f = f
          self.station =station


       def xmlToString(self):
           data = self.f.read()
           self.f.close()
           ...
           return station_arr


       def exportArray(self):
           f= open('stations/'+self.STATION+'.txt')
           lines= f.readlines()
           ...
           return phenomena,parameters


       def calcAvg(self,phenomena,parameters):
           split_phenom = self.phenomena.split(';')
           list_of_lists = []
           for e in self.parameters:
              ...
           return avg_dict,dict_values

** 主要 **:

     for station in stations_names:
         f = open('respond.txt','r')
         ## Instantiate class: ClassXmlString
         xmlStr = ClassXML.XML(f,station) 
         stations_arr =  xmlStr.xmlToString()
           if stations_arr !='':
              phenomena,parameters = xmlStr.exportArray()
              avg_dict,dict_values = xmlStr.calcAvg(phenomena,parameters)
4

2 に答える 2

2
class XML():

   def __init__(self,f,station):
      self.f = f
      self.station=station


   def xmlToString(self):
       data = self.f.read()
       self.f.close()
       ...
       self.station_arr = station_arr


   def exportArray(self):
       #here you need to use self.station_arr

       f= open('stations/'+self.station+'.txt')
       lines= f.readlines()
       ...
       self.phenomena=phenomena
       self.parameters=parameters

   def calcAvg(self,):

       #here you need to use self.phenomena and self.parameters

       split_phenom = self.phenomena.split(';')
       list_of_lists = []
       for e in self.parameters:
          ...
       self.avg_dict = avg_dict
       self.dict_values = dict_values

   def makeOutput(self):
       #call all your functions
       self.xmlToString()
       self.exportArray()
       self.scalcAvg()
       return self.avg_dict , self.dict_values


#now in your main you need to instanciate your class once! not each time you need to call a method:

stations_names ['one', 'two'...]

       for station in stations_names:
           f = open('respond.txt','r')

           xmlStr = ClassXML.XML(f,station) 
           avg_dict,dict_values =  xmlStr.makeOutput()

試したことはありませんが、動作するはずです。

于 2013-04-26T09:07:36.500 に答える
1

物事を少し簡単にするために、ソリューションの編成方法を変更できると思います。

あなたが投稿したコードに基づいて、私はそれを仮定しています:

  • xmlToString は、ファイル f とステーションをパラメーターとして受け取ります
  • exportArray は、stations_arr をパラメーターとして受け取ります
  • calcAvg は (現象、パラメータ) をパラメータとして取ります

avg_dictまた、最終的には ( , )に興味があると仮定しますdict_values。とはいえ、このソリューションのわずかにリファクタリングされたバージョンは次のようになります。

メインコード:

   stations_names ['one', 'two'...]
   for station in stations_names:
       my_xml_object         = ClassXML.XML('respond.txt', station) 
       avg_dict, dict_values = my_xml_object.calcAvg()

クラス:

class XML():

   def __init__(self, f_name, station):
      # 1 - define self.data
      with open(f_name, 'r') as f:
          self.data = f.read()
      # 2 - define self.station_arr
      self.station_arr = self.xmlToString(station)
      # 3 - Finally define (phenomena, parameters), which 
      # will be used by calcAvg()
      self.phenomena, self.parameters = self.exportArray(station_arr)

   def xmlToString(self, station):
       data = self.data
       ...
       return station_arr

   def exportArray(self, station_arr):
       # you must define self.STATION somewhere
       f = open('stations/' + self.STATION + '.txt')
       lines = f.readlines()
       ...
       return phenomena, parameters


   def calcAvg(self):
       split_phenom = self.phenomena.split(';')
       list_of_lists = []
       for e in self.parameters:
          ...
       return phenomena, parameters

私はそれをテストしていませんが、最も重要なことは、アイデアを理解することです。

于 2013-04-26T09:25:43.620 に答える