python 中的动态覆盖魔术方法

Dynamic overwriting magic methods in python

我正在为我编写的这段代码寻找合适的解决方案。我只是想有可能在我的 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')

我的 class 需要是静态的,因为软件在整个 运行 期间不能处理超过一个实例,用户仍然必须在此期间创建多个 xml 运行(是的,这是一团糟,但我无能为力)。 我做了一些对我有用的事情,而不是做一些奇怪的事情:

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

...所以这个 class 允许我打印

class MyClass(object):

def create_xml():
  return Document()

...所有这些,因为我必须拥有

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

...而只是

xml = Document()

对不起大家的困惑...我想我首先搞砸了这里的计划

不太懂,但是如果你想重写一个方法,就重写它:)

class XMLDoc(Document):

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

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

为什么不只是子class Document

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

您还可以创建包装器 class:

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