python中的动态覆盖魔术方法
我正在为我编写的代码寻找合适的解决方案。我只想在XML还在生成时能够打印它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._
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')