2017-10-18 13 views
1

J'essaie d'utiliser la fonction iterparse de ElementTree pour analyser un grand fichier XML OpenStreetMap (OSM). J'essaie de définir mon fichier OSM et ses éléments en tant qu'objets de classe pour faciliter mon analyse ultérieure.Comment créer une instance d'un objet de classe avec la fonction d'un autre objet de classe en Python?

Maintenant, j'ai défini avec succès une classe OSM:

  • parse() utilise un générateur pour iterparse le fichier OSM. Il donne elem (éléments dans OpenStreetMap).
  • reset() réinitialiser le générateur pour éviter l'épuisement.
  • slice() utilise itertools pour faire des vues du fichier OSM en passant l'index de start, stop et step. Il renvoie une liste de elem.
  • iloc() appelé la fonction tranche pour localiser un elem spécifique.
  • getchild() renvoie l'élément secondaire d'un élément avec un index donné.

Mon problème est: Je veux faire une autre classe elem pour créer des fonctions sur un seul élément. Cependant, je dois seulement générer une instance de elem en appelant une fonction de OSM. , c'est-à-dire que j'ai class1. Et quand j'appelle une fonction d'une instance de class1, il doit créer et renvoyer une instance de class2.

Comment puis-je obtenir ceci?

Voici mon code actuel:

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

Vous le faites de la même façon que vous instancier toute autre classe à tout autre endroit dans votre code. – kindall

Répondre

0

J'ai trouvé un moyen:

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

    def reproduce(self): 
     return Child() 

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