2017-09-27 5 views
0

En python 3.5.2, la hiérarchie de la classe suivante:python trois sous-classes en cas de classe interne

class Foobaz(object): 
    def __init__(self): 
     pass 


class Foo(object): 
    def __init__(self): 
     pass 


class Baz(Foobaz): 

    class Bar(Foo): 
     def __init__(self): 
      super(Bar, self).__init__() 

    def __init__(self): 
     super(Baz, self).__init__() 
     self.bar = self.Bar() 


if __name__ == '__main__': 
    b = Baz() 

instancier les rendements de classe Baz

super(Bar, self).__init__() 
NameError: name 'Bar' is not defined 

ayant une classe interne sous-classé directement à partir de l'objet - c'est-à-dire, pas d'appel à super - c'est très bien. Je n'ai aucune idée pourquoi. Quelqu'un peut-il l'expliquer s'il vous plaît?

Répondre

2

Bar n'est pas visible, c'est une variable de classe. Vous aurez besoin d'être explicite:

super(Baz.Bar, self).__init__() 

Prenez note que la forme no argument de super prend soin de cela pour vous:

super().__init__() 

fonctionne très bien.

+0

Super, merci. Cela va rendre ma vie plus facile. Mais lequel de ces deux moyens est préférable? – jake77

+0

Si vous écrivez un code qui tente d'être agnostique, utilisez le premier. Si vous n'allez pas avec le second. –

+2

Supprimer le commentaire sur 'idéalement'. Utiliser 'type (self)' dans super est une grosse erreur! – wim