python中的动态覆盖魔术方法

python中的动态覆盖魔术方法,python,magic-methods,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._

我正在为我编写的代码寻找合适的解决方案。我只想在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(是的,这很糟糕,但我无能为力)。 我没有做奇怪的事情,而是做了对我有用的smth:

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

对不起,大家把我搞糊涂了。。。我猜这里的计划是我首先搞砸的

不太清楚,但是如果你想覆盖一个方法,就覆盖它:)


为什么不只是子类
文档

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

你只想做你所写的,因为那里不存在
self
。试试
doc.\uuu str\uuu=print\u doc
。你所谓的工作代码不是用户友好的,因为它实际上不工作,但除此之外,我不明白你为什么说它不人性化。1)这是一个静态类。解析器基于文档,但只有我的方法才可见。对不起,我没提那个。@user2678074我不太明白。你以前从未说过“只有我的方法才可见”。Python中的“静态类”是什么?你能回答你的问题并解释为什么子类化方法不起作用,或者包括一个它不起作用的例子吗?是的,我会的。请给我一秒钟
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')