2013-04-22 34 views
0

下面是我進口的ElementTree:的Python - 難度調用父方法(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') 

初始化和save_xml工作如預期。事情變得混亂是任何時候,我需要使用Foo對象的根的方法,如將一些東西附加到富的ElementTree根:

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

這會產生這樣的錯誤:

AttributeError: getroot 
  • 如何從Foo內正確調用getroot()?

  • 爲什麼不self.getroot()工作,但self.write()呢?

  • 從ElementTree 對象繼承的對象有問題嗎?

  • 我渾然不覺地跑向面向對象的重要面向對象 概念障礙嗎?

+0

'self = X'往往不是很好的形式...... – 2013-04-22 21:03:10

+0

@Joran Beasley--你可能會說,我對Python很陌生,所以我很欣賞這種批評。你能擴展一下嗎?爲什麼它是不好的形式,什麼是最好的選擇? – busfullofbears 2013-04-22 22:05:23

回答

0

我不是familliar與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) 

如果一個基類沒有從繼承的對象,你可能無法使用超級聲明另一種方法是提出以下(只是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 

我懷疑在這裏的某個地方是你錯過了什麼。您可能需要以某種方式調用超級構造函數。

+0

謝謝!所以,如果我理解正確,我沒有做的是與子類一起初始化基類。如果基類繼承自對象(我相信人們把它們稱爲「新風格」類),我可以用超類來做到這一點,否則我必須以第二種方式做到這一點。 即使這不完全正確,我至少知道我不知道什麼,並可以自己研究這個,所以再次感謝。 – busfullofbears 2013-04-23 01:07:45