2017-10-18 124 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 
相关问题