2014-05-19 97 views
1

我想在Python使用超()調用父類的方法2.從子類調用父類方法在Python 2

在Python 3,我想這樣的代碼吧:

class base: 
     @classmethod  
     def func(cls): 
      print("in base: " + cls.__name__) 

    class child(base): 
     @classmethod  
     def func(cls): 
      super().func() 
      print("in child: " + cls.__name__) 

    child.func() 

與此輸出:

in base: child 
    in child: child 

但是,我不知道,如何在Python 2。做到這一點。當然,我可以使用base.func(),但我不喜歡,除了指定的父類名和主要是我得到不想要的結果:

in base: base 
    in child: child 

隨着clscls is child)在super()函數調用的第一個參數,我得到這個錯誤:

TypeError: must be type, not classobj 

不知道如何使用super()或類似的功能做在我沒有來指定父類的名稱?

+1

提示:複製你的問題貼到谷歌搜索 – Dunno

回答

3

進一步對方的回答你能爲它做classmethods像

class base(object): 
     @classmethod  
     def func(cls): 
      print("in base: " + cls.__name__) 

class child(base): 
     @classmethod  
     def func(cls): 
      super(cls, cls).func() 
      print("in child: " + cls.__name__) 

child.func() 
+0

謝謝,這是我想要的東西:) –

+0

應該是'超(兒童,CLS)'。否則'child'的子類以無限遞歸調用'func'結束。 – saaj

1

你父對象需要從對象繼承在Python 2。所以:

class base(object): 
    def func(self): 
     print("in base") 

class child(base): 
    def func(self): 
     super(child, self).func() 
     print("in child") 

c = child() 
c.func() 
0

我試圖做同樣的事情在那裏我試圖基本上「繼續」繼承鏈,直到找到某個基類,然後在那裏用類名做一些事情。我遇到的問題是,所有這些答案都假設你知道你想要獲得超類的班級的名字。我嘗試了「super(cls,cls)」方法,但得到了上述的「無限遞歸」問題。這裏是我登陸

@classmethod 
def parent_name(cls): 
    if BaseDocument in cls.__bases__: 
     # This will return the name of the first parent that subclasses BaseDocument 
     return cls.__name__ 
    else: 
     for klass in cls.__bases__: 
      try: 
       parent_name = klass.parent_name() 
       if parent_name is not None: 
        return parent_name 
      except AttributeError: 
       pass 

     return None