web-dev-qa-db-fra.com

Méthodes statiques Python - Comment appeler une méthode depuis une autre méthode

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()

parce qu'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 gâchis. Ok, j'ai modifié la question à la question initiale. J'ai déjà la réponse à la deuxième question 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à, merci de me le dire.

68
Pablo

class.method devrait fonctionner. 

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()
58
jldupont

Comment dois-je faire en Python pour appeler une méthode statique à partir d'une autre méthode statique de la même classe?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()
91
warvariuc

NOTE - il semble que la question en ait changé. La réponse à la question de savoir comment appeler une méthode d'instance à partir d'une méthode statique est qu'il est impossible de passer d'une instance sous forme d'argument ou d'instancier cette instance dans la méthode statique.

Ce qui suit consiste principalement à répondre "comment appelez-vous une méthode statique à partir d'une autre méthode statique":

N'oubliez pas qu'il y a est une différence entre les méthodes statiques et les méthodes de classe en Python. Une méthode statique ne prend aucun 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:

Si c'est une méthode statique:

test.dosomethingelse()

Si c'est une méthode de classe:

cls.dosomethingelse()
8
Jason Baker

OK, la principale différence entre les méthodes de classe et les méthodes statiques est la suivante:

  • méthode de classe a sa propre identité, c'est pourquoi ils doivent être appelés à partir d'une INSTANCE.
  • d'autre part, la méthode statique peut être partagée entre plusieurs instances, de sorte qu'elle doit être appelée depuis la classe
3
Ahmad Dwaik

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

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        #creating an instance to be able to call dosomethingelse(),or you may use any existing instace
        a=test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()

espérons que cela vous aidera :)

1
Ahmad Dwaik

Si ceux-ci ne dépendent pas de la classe ou de l'instance, pourquoi ne pas simplement en faire une fonction? Cela semblerait être la solution évidente. À moins bien sûr que vous pensiez qu'il va falloir l'écraser, la sous-classe, etc. Si c'est le cas, les réponses précédentes sont la meilleure solution. Je croise les doigts pour ne pas proposer simplement une solution alternative qui ne correspond pas forcément aux besoins de certains;).

Comme la réponse correcte dépend du cas d'utilisation du code en question;) Enjoy

0
AppHandwerker