2014-05-19 3 views
1

Je veux appeler la méthode de la classe parent en utilisant super() en Python 2.Appelez une méthode de classe parente d'une classe d'enfants en Python 2

En Python 3, je coder comme ceci:

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() 

avec cette sortie:

in base: child 
    in child: child 

Cependant, je ne sais pas comment le faire en Python 2. Bien sûr, je peux utiliser base.func(), mais je n'aime pas spécifier le nom de la classe parent en plus et principalement je reçois résultat indésirable:

in base: base 
    in child: child 

Avec cls (cls is child) comme premier argument super() appel de fonction, je reçois cette erreur:

TypeError: must be type, not classobj 

Toute idée de comment le faire en utilisant super() ou fonction analogue dans laquelle je n'ai pas spécifier le nom de la classe parente?

+1

indice: copier-coller votre question dans la recherche google – Dunno

Répondre

3

faire avancer l'autre réponse que vous pouvez faire classmethods pour comme

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

Merci, ce que je veux :) –

+0

devrait être 'super (enfant, cls)'. Sinon, la sous-classe 'child' se termine par une récursion infinie appelant' func'. – saaj

1

objet parent Vous doit hériter de l'objet en python 2. Donc:

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

Je tentais de faire quelque chose de similaire où j'essayais de «remonter» la chaîne d'héritage jusqu'à ce que je trouve une certaine classe de base et que je fasse quelque chose avec le nom de la classe. Le problème que j'avais était que TOUTES ces réponses supposent que vous connaissez le nom de la classe que vous essayez d'obtenir le super de. J'ai essayé l'approche "super (cls, cls)" mais j'ai obtenu le "récursion inifinite" décrit ci-dessus. Voici où je débarquai

@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 
Questions connexes