Quand dois-je utiliser @classmethod et quand def méthode(auto)?
Tout en intégrant un Django app je n'ai pas utilisé avant, j'ai trouvé deux façons différentes utilisées pour définir les fonctions dans les classes. L'auteur semble utiliser à la fois très intentionnellement. Le premier est celui que j'utilise moi-même beaucoup:
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
L'autre est un je n'ai pas l'utilisation, principalement parce que je ne comprends pas quand l'utiliser, et ce pour:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
Dans le Python docs le classmethod
décorateur est expliqué avec cette phrase:
Une méthode de la classe reçoit la classe implicite premier argument, juste
comme une méthode d'instance reçoit l'instance.
Donc je suppose que cls
se réfère à Dummy
lui-même (le class
, pas l'instance). Je n'ai pas de comprendre exactement pourquoi cela existe, car j'ai toujours pu le faire:
type(self).do_something_with_the_class
Est-ce juste par souci de clarté, ou ai-je raté la partie la plus importante: effrayant et fascinant des choses qui n'a pas pu être fait sans elle?
Vous devez vous connecter pour publier un commentaire.
Votre supposition est correcte - vous comprendre comment
classmethod
s de travail.La raison est que ces méthodes peuvent être appelées à la fois sur une instance OU sur la classe (dans les deux cas, l'objet de classe sera passé comme premier argument):
Sur l'utilisation de ces instances: Il y a au moins deux utilisations principales pour l'appel d'une classmethod sur un exemple:
self.some_function()
va appeler la version desome_function
sur le type réel deself
, plutôt que de la classe dans laquelle cet appel arrive à apparaître (et n'aurez pas besoin de l'attention si la classe est renommé); etsome_function
est nécessaire de mettre en œuvre un protocole, mais il est utile de faire appel à l'objet de classe seul.La différence avec
staticmethod
: Il y a une autre manière de définir des méthodes qui n'ont pas accès à des données de l'instance, appeléstaticmethod
. Qui crée une méthode qui ne bénéficie pas d'un implicite premier argument; en conséquence, il ne sera pas adopté toutes les informations au sujet de l'instance ou de classe sur laquelle il a été appelé.L'utilisation principale que j'ai trouvé pour elle est de s'adapter à une fonction existante (ce qui ne veut pas s'attendre à recevoir un
self
) à une méthode d'une classe (ou un objet).self.foo()
quand il doit êtreBar.foo()
.self.foo()
est préférable, parce queself
peut être une instance d'une sous-classe qui implémente sa proprefoo
.classmethod
etstaticmethod
, FWIW.staticmethod
. Je vais ajouter quelque chose, bien que.Bar
, comme1+1 == 2 == 1*2
, il est donc impossible de dire à partir des résultats montre queBar().static_method
est en fait appelé.won't need attention if the class is renamed
Si vous ajoutez le décorateur @classmethod, cela signifie Que vous allez faire de cette méthode en tant que méthode statique de java ou C++. ( méthode statique est une terme général je suppose que 😉 )
Python dispose également d' @staticmethod. et la différence entre classmethod et staticmethod est de savoir si vous pouvez
l'accès à la classe ou variable statique à l'aide d'un argument ou d'un nom de classe elle-même.
toutes ces classes augmentation de la cls.cls_var par 1 et de l'imprimer.
Et toutes les classes avec le même nom sur le même champ d'application, ou des instances construit avec ces classe va partager ces méthodes.
Il n'y a qu'un TestMethod.cls_var
et aussi il n'y a qu'un TestMethod.class_method() , TestMethod.static_method()
Et importante question. pourquoi ces méthodes seraient nécessaires.
classmethod ou staticmethod est utile lorsque vous effectuez cette classe comme une usine
ou lorsque vous devez initialiser votre classe qu'une seule fois. comme d'ouvrir le fichier une fois, et en utilisant la méthode d'alimentation pour lire le fichier ligne par ligne.