如何使用Python中另一个类对象的函数创建一个类对象的实例?

时间:2017-10-18 23:54:18

标签: python xml openstreetmap elementtree itertools

我尝试使用ElementTree的iterparse函数来解析大型OpenStreetMap(OSM)XML文件。我试图将我的OSM文件及其元素定义为类对象,以帮助我以后的分析。

现在我已经成功定义了OSM类:

  • parse()使用生成器来分析OSM文件。它产生elem(OpenStreetMap中的元素)。
  • reset()重置生成器以避免耗尽。
  • slice()使用itertools通过传递start,stop和step的索引来创建OSM文件的视图。它返回elem
  • 的列表
  • iloc()调用了切片函数来查找特定的elem
  • getchild()返回具有给定索引的元素的辅助元素。

我的问题是:我想创建另一个类elem来在单个元素上创建函数。但是,我必须通过调用elem函数来生成OSM的实例。 即我有 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)

1 个答案:

答案 0 :(得分:0)

我找到了办法:

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

    def reproduce(self):
        return Child()

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