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 ElementTree のルートに何かを追加するなど、メソッドで Foo オブジェクトのルートを使用する必要がある場合です。

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 に答える