python中的动态覆盖魔术方法

时间:2017-04-21 09:48:29

标签: python magic-methods

我正在为我已经制作的代码寻找合适的解决方案。我只是希望能够在我的XML仍在构建时打印它。

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

对不起大家的混淆......我想这里刨的是我先搞砸了

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:0)

不确定理解,但是如果你想覆盖一个方法,只需覆盖它:)

class XMLDoc(Document):

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

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