2009-08-11 9 views
0
#!/usr/bin/python 

class Bar(object): 

    @staticmethod 
    def ruleOn(rule): 
    if isinstance(rule, tuple): 
     print rule[0] 
     print rule[0].__get__(None, Foo) 
    else: 
     print rule 

class Foo(object): 

    @classmethod 
    def callRule(cls): 
    Bar.ruleOn(cls.RULE1) 
    Bar.ruleOn(cls.RULE2) 


    @classmethod 
    def check(cls): 
    print "I am check" 

    RULE1 = check 
    RULE2 = (check,) 

Foo.callRule() 

Sortie:stockage référence classmethod dans tuple ne fonctionne pas comme dans la variable

<bound method type.check of <class '__main__.Foo'>> 
<classmethod object at 0xb7d313a4> 
<bound method type.check of <class '__main__.Foo'>> 

Comme vous pouvez le voir, je suis en train de stocker une référence à une fonction classmethod dans un tuple pour une utilisation future .

Cependant, il semble stocker l'objet lui-même plutôt que la référence à la fonction liée.

Comme vous le voyez, cela fonctionne pour une référence variable. La seule façon de l'obtenir est d'utiliser __get__, ce qui nécessite le nom de la classe à laquelle il appartient, qui n'est pas disponible au moment de l'affectation des variables RULE.

Vous avez des idées?

Répondre

0

Ceci est dû au fait que les méthodes sont en réalité des fonctions en Python. Ils ne deviennent des méthodes liées que lorsque vous les recherchez dans l'instance de classe construite. Voir ma réponse au this question pour plus de détails. La variante non-tuple fonctionne car elle est conceptuellement identique à l'accès à une méthode de classe.

Si vous voulez vous attribuer classmethods liées aux attributs de classe devrez le faire après vous construisez la classe:

class Foo(object): 
    @classmethod 
    def callRule(cls): 
     Bar.ruleOn(cls.RULE1) 
     Bar.ruleOn(cls.RULE2) 

    @classmethod 
    def check(cls): 
     print "I am check" 

Foo.RULE1 = Foo.check 
Foo.RULE2 = (Foo.check,) 
+0

Merci, cela a du sens. Juste par curiosité Existe-t-il un moyen de récupérer le nom de la classe pendant sa construction? –

+0

Non. L'objet de classe n'existe pas pendant l'exécution du corps de la classe. Le mieux que vous puissiez faire est de lier les fonctions en utilisant un décorateur de classe ou une métaclasse. –

Questions connexes