2010-10-19 4 views
3

Ma question concerne environ deux réponses à une autre question: Using class/static methods as default parameter values within methods of the same class.méthode statique en tant que paramètre par défaut à une méthode de classe

J'essaie de comprendre s'il y a vraiment une différence entre ce que font les deux réponses, et si oui, quels sont les avantages et les inconvénients de chacune d'elles. Question: comment utiliser une méthode de classe comme paramètre par défaut pour une méthode de la même classe.

Réponse 1: utiliser une fonction au lieu d'une méthode de classe

class X: 
    def default_func(x): 
     return True 

    def test(self, func = default_func): 
     return func(self) 

Réponse 2: utiliser une méthode de classe, mais le convertir en fonction

def unstaticmethod(static): 
    return static.__get__(None, object) 

class X: 
    @staticmethod 
    def default_func(x): 
     return True 

    def test(self, func = unstaticmethod(default_func)): 
     return func(self) 

Cela a été initialement écrit en Python 2 , mais mon résumé est (espérons-le) Python 3.

Répondre

2

La réponse dépend vraiment des autres intentions que vous avez pour X.default_func. Si vous souhaitez que X.default_func soit appelé en dehors d'une instance de X, vous voulez qu'il s'agisse d'une méthode statique (réponse 2).

# in other code... 
some_object = "Bring out your dead" 
X.default_func(some_object) 

Si, d'autre part, vous ne vous attendez pas que default_func sera jamais appelé, sauf dans une instance de X (et bien sûr utilisé comme valeur par défaut pour test), je récrire Réponse 1 être une bonne méthode (et utiliser la convention de self).

class X: 
    def default_func(self): 
     return True 

    def test(self, func = default_func): 
     return func(self) 

Comme une note de côté, je voudrais souligner que vous auriez pu écrire Réponse 2 différemment pour éviter le unstaticmethod:

class X: 
    def default_func(x): 
     return True 

    def test(self, func = default_func): 
     return func(self) 

    default_func = staticmethod(default_func) 

La raison qui fonctionne est parce que la classe X n'est pas created (et default_func ne devient pas une méthode de X) jusqu'à ce que le bloc entier sous class X: soit traité (y compris l'argument par défaut pour test(func)).

+0

Je vais être confus. Si default_func sera seulement * appelé * dans test(), mais que test() est appelé depuis l'extérieur de la classe, comment puis-je faire un appel depuis l'extérieur de la classe équivalente à "X(). Test (func = second_func)" où second_func est une fonction membre de X. –

+0

Python 2 n'a pas le concept d'une "fonction membre". Les classes et leurs instances n'ont que des méthodes. Si "second_func" est une méthode d'instance normale, vous devrez obtenir la fonction sous-jacente en utilisant 'im_func':' X(). Test (func = X.second_func.im_func) '. Je ne le recommande pas. Si vous devez sélectionner des méthodes dynamiquement, vous feriez mieux de passer les noms de méthodes à la fonction de test, puis de faire quelque chose comme 'getattr (self, func_name)()' dans test, et laissez Python faire la liaison d'instance. –

Questions connexes