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.
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. –
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. –