0

这是我导入 ElementTree 的方式:

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

这是我的课程的一个片段:

class Foo(ET.ElementTree):
    def __init__(self, *args):
        if args[0] == "file":
            # populate from xml file
            self = load_xml(self, *args[1:])
        elif args[0] == "user_input":
            # populate from user_input
            self = load_from_user_input(self, *args[1:])
        else:
            raise ValueError("Error initializing Foo: Invalid argument")

    def save_xml(self, file_name):
        self.write(file_name + FOO_EXTENSION, xml_declaration=True, encoding='utf-8', method='xml')

init和 save_xml 按预期工作。当我需要在方法中使用 Foo 对象的根时,事情变得令人困惑,例如将某些内容附加到 Foo ElementTree 的根:

root = self.getroot()
root.append(something)

这会产生此错误:

AttributeError: getroot
  • 如何从 Foo 中正确调用 getroot()?

  • 为什么 self.getroot() 不起作用,但 self.write() 起作用?

  • 我从 ElementTree 对象继承的方式有什么问题吗?

  • 我是否在不知不觉中遇到了一个重要的面向对象的概念障碍?

4

1 回答 1

0

我不熟悉 ET.ElementTree 类,但它基本上是这样的

class Base(object):
    def __init__(self,*args,**kwargs):
       print "Base Constructor Recieved:",args,kwargs
       pass #do something with the args and kwargs

    def do_something(self,*args):
       print "CALLED BASE DO SOMETHING!"

class InheritsFromBase(Base):
    def __init__(self,*args,**kwargs):
        #modify args and kwargs how you want
        new_args = ["a","b","v"]
        super(Base,self).__init__(*new_args,**kwargs) #initialize super class

    def do_something(self,operator,lhs,rhs):
        print "Do Something InheritsFromBase %s%s%s"%(lhs,operator,rhs)
        super(Base,self).do_something("arg1","arg2","arg3","...")

x = InheritsFromBase()
x.do_something("%",5,4)

如果基类不继承自对象,则可能无法使用 super 语句,下面提供了替代方法(仅 init 方法)

def __init__(self,*args,**kwargs):
    #modify args and kwargs how you want
    new_args = ["a","b","v"]
    Base.__init__(self,*new_args,**kwargs) #initialize super class

我怀疑这里的某个地方是你所缺少的。您可能需要以某种方式调用超级构造函数。

于 2013-04-22T22:47:04.647 回答