2010-08-03 7 views
2

Voici un exemplepropriété Python et la méthode question prioritaire: pourquoi la propriété sous-classe appelle encore la méthode de classe de base

class A(object): 
     def f1(self): 
       return [] 
     test1 = property(f1) 


class B(A): 
     def f1(self): 
       return [1, 2] 

if __name__ == "__main__": 
     b = B() 
     print b.test1 

Je pense que la sortie soit [1, 2], mais il imprime [] à la place.

C'est contraire à mes attentes.

Ai-je commis une erreur dans le code? Sinon, je suppose que cela fonctionne de cette façon parce que quand la propriété test1 est créée, elle est liée à la fonction f1 de la classe de base A. Qu'est-ce qu'une implémentation alternative possible pour réaliser ce que je veux?

+0

BTW, pourquoi CW pour une question tout à fait technique susceptible de réponses nettes et aussi techniques ?! J'ai répondu avant de repérer l'étiquette CW - cependant, je déteste et évite généralement les questions si mal étiquetés (CW quand ils ne devraient pas être évidemment, ou vice versa). –

Répondre

6

Vous pouvez reporter la recherche de f1 avec une fonction lambda si vous ne souhaitez pas polluer l'espace de noms de classe

class A(object): 

     def f1(self): 
       return [] 

     test1 = property(lambda x:x.f1()) 
3

Je suppose que cela fonctionne de cette façon parce que lorsque le test1 de la propriété est créée, elle est lié à la fonction f1 de la classe de base A.

Exactement correct.

Quelle est une alternative possible d'implémentation pour réaliser ce que je veux?

Un niveau plus d'indirection:

class A(object): 
    def f1(self): return [] 
    def _f1(self): return self.f1() 
    test1 = property(_f1) 

class B(A): 
    def f1(self): return [1, 2] 
1

Quelques alternatives que je peux penser à: soit répéter l'appel à property dans la sous-classe,

class B(A): 
    def f1(self): 
     return [1,2] 
    test1 = property(f1) 

ou la base de la propriété sur une autre méthode qui appelle f1:

class A(object): 
    def f1(self): 
     return [] 
    def _f1(self): 
     return self.f1() 
    test1 = property(_f1)