2017-04-21 5 views
-1

Je cherche une solution appropriée pour ce code que j'ai fait. Je veux juste avoir la possibilité d'imprimer mon XML pendant qu'il est en construction.Méthodes magiques d'écrasement dynamique en python

from xml.dom.minidom import Document, DOMImplementation 

class MyClass(object): 

init(): 
    pass 

def create_xml(): 
    doc = Document() 
    # I know i cannot do that, I know. I need proper solution for that 
    doc.__str__ = self.print_doc 

def print_doc(document): 
    return document.toprettyxml(encoding='UTF-8') 

Nous sommes en mesure de trouver un moyen pas propre pour elle, qui fonctionne, de sorte que vous pouvez voir mon idée ici:

from xml.dom.minidom import Document, DOMImplementation 

def create_xml(): 
    doc = Document() 
    document.__str__ = partial(self.print_doc, document=document) 

def print_doc(document): 
    return document.toprettyxml(encoding='UTF-8') 

Ma classe doit être statique, en tant que logiciel ne peut pas gérer plus d'une instance pendant une exécution complète, l'utilisateur doit créer plus d'un xml pendant cette exécution (oui, c'est foiré, mais je ne peux pas aider). Au lieu de cela faire des choses bizarres, je l'ai fait smth qui fonctionne pour moi:

class Child(Document): 
    def __str__(self): 
     return document.toprettyxml(encoding='UTF-8') 

... donc cette classe me permet d'imprimer

class MyClass(object): 

def create_xml(): 
    return Document() 

... tout cela, beacause je dois avoir

def main(): 
    xml = MyClass.create() 
    print(xml) 

... au lieu que

xml = Document() 

tout le monde Désolé pour la confusion ... Je suppose que raboter ici est ce que je foiré première

+0

Vous voulez seulement faire ce que vous avez écrit parce que 'self' n'existe pas là. Essayez 'doc .__ str__ = print_doc'. – jonrsharpe

+0

Votre prétendu code de travail n'est pas convivial car il ne fonctionne pas mais à part ça, je ne vois pas pourquoi vous dites que ce n'est pas humain. – Goyo

Répondre

1

Pourquoi pas seulement la sous-classe Document?

class MyDoc(Document): 
    def __str__(self): 
     return self.toprettyxml(encoding='UTF-8') 

Vous pouvez également créer une classe wrapper:

class DocumentWrapper(object): 
    def __init__(self, doc): 
     self.doc = doc # doc should be a "Document". 
    def __str__(self): 
     return self.doc.toprettyxml(encoding='UTF-8') 
+0

1) Ceci est censé être une classe statique. L'analyseur est basé sur Document, mais seules mes méthodes devraient être visibles. Désolé, je n'ai pas mentionné cela. – user2678074

+0

@ user2678074 Je ne comprends pas très bien. Vous n'avez jamais rien dit à propos de "seulement mes méthodes devraient être visibles" avant. Et qu'est-ce qu'une "classe statique" en Python? Pourriez-vous [éditer] votre question et expliquer pourquoi l'approche de sous-classement ne fonctionne pas ou inclure un exemple où cela ne fonctionne pas? – MSeifert

+0

Oui, je le ferai. S'il vous plaît, donnez-moi une seconde – user2678074

0

Je ne sais pas à comprendre, mais si vous voulez remplacer une méthode, juste l'ignorer :)

class XMLDoc(Document): 

    def __str__(self): 
     return self.toprettyxml(encoding='UTF-8') 

myxml = XMLDoc([.. args ..]) 
print str(myxml)