2017-10-18 17 views
1

大きなOpenStreetMap(OSM)XMLファイルを解析するために、ElementTreeの関数iterparseを使用しようとしています。 OSMファイルとその要素を後の分析に役立つクラスオブジェクトとして定義しようとしています。Pythonで別のクラスオブジェクトの関数を使って1つのクラスオブジェクトのインスタンスを作成するには?

  • parse()は、OSMファイルをiterparseする発電機を使用しています。

    は今、私は正常OSMクラスを定義しました。 elem(OpenStreetMapの要素)が生成されます。

  • reset()枯渇を避けるために発電機をリセットします。
  • slice()は、start、stop、stepのインデックスを渡してitertoolsを使用してOSMファイルのビューを作成します。 elemのリストを返します。
  • iloc()は、特定のelemを見つけるスライス機能と呼ばれます。
  • getchild()は、特定のインデックスを持つ要素の2次要素を返します。

私の問題は、次のとおりです。私は、単一の要素に関数を作成するために、別のクラスelemを作りたい。しかし、私はOSMの関数を呼び出すことによってelemのインスタンスを生成する必要があります。 つまり、クラス1です。 クラス1のインスタンスの関数を呼び出すときは、クラス2のインスタンスを作成して返します。

どうすればこの問題を解決できますか?

import xml.etree.cElementTree as ET 
from collections import defaultdict 
import itertools 


class OSM: 

    def __init__(self, data): 
     self.data = data 
     self.parser = ET.iterparse(self.data, events=('start',)) 

    def parse(self): 
     _, root = next(self.parser) 
     for event, elem in self.parser: 
      yield elem 
      elem.clear() 
      root.clear() 

    def reset(self): 
     self.parser = ET.iterparse(self.data, events=('start',)) 

    def slice(self, start=0, stop=1, step=1): 
     self.reset() 
     view = [] 
     for i in itertools.islice(self.parse(), start, stop, step): 
      view.append(i) 
     return view 

    def iloc(self, index): 
     self.reset() 
     return self.slice(index, index + 1)[0] 

    def getchild(self, index): 
     self.reset() 
     elem = self.iloc(index) 
     childdict = defaultdict(list) 
     for i, child in enumerate(list(elem)): 
      childdict[i] = [child.tag, child.attrib] 
     return dict(childdict) 
+2

あなたはそれをあなたのコード内の他の場所で他のクラスをインスタンス化と同じように行う

は、ここに私の現在のコードです。 – kindall

答えて

0

私は道を見つけた:

class Mother(object): 
    def __init__(self): 
     pass 

    def reproduce(self): 
     return Child() 

class Child(object): 
    def __init__(self): 
     pass 
関連する問題