#!/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?
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? –
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. –