Quand j'ai des méthodes régulières pour appeler une autre méthode dans une classe, je dois le faire
class test:
def __init__(self):
pass
def dosomething(self):
print "do something"
self.dosomethingelse()
def dosomethingelse(self):
print "do something else"
mais quand j'ai des méthodes statiques je ne peux pas écrire
self.dosomethingelse()
car il n'y a pas d'instance. Comment dois-je faire en Python pour appeler une méthode statique à partir d'une autre méthode statique de la même classe?
Edit: quel bordel. Ok, j'ai modifié la question à la question d'origine. J'ai déjà la réponse à la deuxième question qui se trouve dans le commentaire de Peter Hansen. Si vous pensez que je devrais ouvrir une autre question pour une réponse que j'ai déjà, veuillez me le dire.
python
static-methods
Pablo
la source
la source
Réponses:
class.method
devrait marcher.la source
la source
Test.static_method_to_call()
devrait également fonctionner à partir d'autres méthodes non statiques et non-classe de cette classe, non? (... et probablement d'autres classes aussi?)Test.static_method_to_call()
fonctionnera de n'importe où.REMARQUE - il semble que la question en ait changé. La réponse à la question de savoir comment vous appelez une méthode d'instance à partir d'une méthode statique est que vous ne pouvez pas sans passer une instance en tant qu'argument ou instancier cette instance dans la méthode statique.
Ce qui suit est principalement de répondre "comment appeler une méthode statique à partir d'une autre méthode statique":
Gardez à l' esprit qu'il y a une différence entre les méthodes de statiques et les méthodes de classe en Python. Une méthode statique ne prend pas de premier argument implicite, tandis qu'une méthode de classe prend la classe comme premier argument implicite (généralement
cls
par convention). Dans cet esprit, voici comment procéder:S'il s'agit d'une méthode statique:
Si c'est une méthode de classe:
la source
cls.dosomethingelse()
dans la définition de classe.cls.dosomethingelse()
depuis la méthode de classe elle-même. Tout comme vous ne pouvez utiliser qu'àself
partir d'une méthode d'instance elle-même.OK, la principale différence entre les méthodes de classe et les méthodes statiques est:
la source
vous ne pouvez pas appeler des méthodes non statiques à partir de méthodes statiques mais en créant une instance à l'intérieur de la méthode statique ... cela devrait fonctionner comme ça
j'espère que cela vous aidera :)
la source
@classmethod
pour déclarer vos méthodes, et d'utilisercls.dosomethingelse()
dedanscls.dosomething()
- pire en termes de performances (instanciation d'objets juste pour accéder à une méthode statique) et de lisibilité (ce n'est pas simple, et j'imagine si ce genre du modèle est devenu passe-partout, toute la base de code pourrait devenir assez difficile à analyser pour un simple humain)Si ceux-ci ne dépendent pas de la classe ou de l'instance, pourquoi ne pas en faire une fonction? Comme cela semble être la solution évidente. À moins bien sûr que vous ne pensiez que cela devra être écrasé, sous-classe, etc. Si tel est le cas, les réponses précédentes sont le meilleur choix. Croisons les doigts, je ne serai pas marqué pour simplement offrir une solution alternative qui peut ou non répondre aux besoins de quelqu'un;).
Comme la bonne réponse dépendra du cas d'utilisation du code en question;)
la source