2017-04-21 36 views
-1

我正在寻找适当的解决方案,我已经做了这段代码。我只想在打印XML时打印我的XML。在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') 

我们能够找出它一个不干净的方式,这样的作品,所以你可以看到我的想法在这里:

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') 

我的类需要是静态的,因为软件无法处理在整个运行过程中,比一个实例更多,仍然需要用户在运行期间创建多个xml(是的,这是搞砸了,但我无法帮助)。 而不是让奇怪的事情,我做了不便,会为我工作:

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

...所以这个类可以让我打印

class MyClass(object): 

def create_xml(): 
    return Document() 

......所有这一切,东阳我必须有

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

...而不是仅仅

xml = Document() 

对不起大家了混乱...我想刨这里是我搞砸了第一

+0

你只想做你写什么,因为'self'不存在那里。试试'doc .__ str__ = print_doc'。 – jonrsharpe

+0

您涉嫌工作的代码不是用户友好的,因为它实际上并不工作,但除此之外,我不明白为什么您说它不是人性化的。 – Goyo

回答

1

为什么不只是子类Document

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

你也可以创建一个包装类:

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)这是为了静态类。解析器基于Document,但只有我的方法应该可见。对不起,我没有提到。 – user2678074

+0

@ user2678074我不太明白。你从来没有说过什么关于“只有我的方法应该是可见的”。什么是Python中的“静态类”?你能否编辑你的问题并解释为什么子类方法不起作用,或者包括一个不起作用的例子? – MSeifert

+0

是的,我会的。请给我一下 – user2678074

0

不知道理解的,但如果你想覆盖的方法,只是重写吧:)

class XMLDoc(Document): 

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

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