2017-10-18 202 views
1

我正在嘗試使用ElementTree的iterparse功能來解析一個大的OpenStreetMap(OSM)XML文件。我試圖將我的OSM文件及其元素定義爲類對象,以幫助我進行後續分析。如何使用Python中的另一個類對象的功能創建一個類對象的實例?

現在,我已經成功地定義一個OSM類:

  • parse()使用發電機來iterparse OSM的文件。它產生elem(OpenStreetMap中的元素)。
  • reset()重置發生器以避免耗盡。
  • slice()使用itertools通過傳遞start,stop和step的索引來創建OSM文件的視圖。它返回一個elem的列表。
  • iloc()調用切片功能來定位特定的elem
  • getchild()返回具有給定索引的元素的次要元素。

我的問題是:我不想再拍類elem到一個單一的元素上創建功能。但是,我只能通過調用OSM的函數來生成elem的實例。即我有class1。當我調用class1的實例的函數時,它應該創建並返回一個class2的實例。

我該如何實現這一目標?

這裏是我當前的代碼:

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 
相關問題