Il y a eu une discussion en discussion relative à une question (la question elle-même étant sans rapport avec celle-ci), qui a révélé que je ne connaissais peut-être pas Python.
Dans mon esprit, bien que la terminologie diffère d'une langue à l'autre, nous pouvons généralement classer les fonctions comme suit:
- [libre] fonctions
- méthodes statiques / fonctions membres static
- méthodes non statiques / fonctions membres non statiques
Apparemment, en Python, il existe un autre type de fonction qui ne rentre pas dans les catégories ci-dessus, celle qui est une méthode mais "ne connaît pas sa classe".
Que sont les "méthodes de classe" et les "méthodes d'instance", en Python?
python
terminology
Courses de légèreté avec Monica
la source
la source
Réponses:
La réponse courte
La longue réponse
Méthodes de classe
Une méthode de classe est une méthode qui appartient à la classe dans son ensemble. Cela ne nécessite pas d'instance. Au lieu de cela, la classe sera automatiquement envoyée en tant que premier argument. Une méthode de classe est déclarée avec le
@classmethod
décorateur.Par exemple:
Méthodes d'instance
D'autre part, une méthode d'instance nécessite une instance pour l'appeler et ne nécessite aucun décorateur. C'est de loin le type de méthode le plus courant.
(note: ce qui précède est avec python3; avec python2, vous obtiendrez une erreur légèrement différente)
Méthodes statiques
Une méthode statique est similaire à une méthode de classe, mais n'obtiendra pas l'objet de classe en tant que paramètre automatique. Il est créé en utilisant le
@staticmethod
décorateur.Liens de documentation
Voici des liens vers la documentation python3 pertinente:
La documentation du modèle de données a ceci à dire sur la différence entre les méthodes de classe et les méthodes statiques:
Questions connexes
la source
"^ def("
, puis toutes les instances de@staticmethod
. Très peu scientifique, mais probablement dans les limites du stade.Une "méthode d'instance" utilise les informations contenues dans l'instance pour déterminer la valeur à renvoyer (ou l'effet secondaire à effectuer). Ce sont très communs.
Une "méthode de classe" utilise des informations sur la classe (et non une instance de cette classe) pour affecter son action (elles sont généralement utilisées pour créer de nouvelles instances en tant que constructeurs alternatifs et ne sont donc pas incroyablement communes).
Une "méthode statique" n'utilise aucune information sur la classe ou l'instance pour calculer ce qu'elle fait. C'est généralement juste dans la classe pour plus de commodité. (En tant que tels, ils ne sont pas très courants non plus.)
Une fonction de X
Rappelez-vous la classe de mathématiques, "y est une fonction de x
f(x)
,?" Appliquons cela dans le code:Ce qui est supposé par ce qui précède est que depuis
x
peut changer,y
peut changer lorsque desx
changements C’est ce que l’on entend par "y
fonction dex
"Qu'est - ce qui
y
est quandz
est1
?2
?'FooBarBaz'
?y
n'est pas une fonction dez
, doncz
peut être n'importe quoi et ne pas affecter le résultat de la fonction en supposant que notre fonctionfunction
est pure. (Si elle accède enz
tant que variable globale, alors ce n'est pas une fonction pure - c'est ce que l'on entend par pureté fonctionnelle.)Gardez ce qui précède à l’esprit lorsque vous lisez les descriptions suivantes:
Méthodes d'instance
Une méthode d'instance est une fonction qui est une fonction d' une instance . La fonction accepte implicitement l'instance en tant qu'argument et l'instance est utilisée par la fonction pour déterminer la sortie de la fonction.
Un exemple intégré d'une méthode d'instance est str.lower:
str.lower
est appelé sur l'instance de la chaîne et utilise les informations contenues dans l'instance pour déterminer la nouvelle chaîne à renvoyer.Méthodes de classe:
Rappelez-vous, en Python, tout est un objet. Cela signifie que la classe est un objet et peut être transmise comme argument à une fonction.
Une méthode de classe est une fonction qui est une fonction de la classe . Il accepte la classe comme argument.
Un exemple intégré est
dict.fromkeys
:La fonction connaît implicitement sa propre classe. Elle utilise la classe pour affecter la sortie de la fonction et crée une nouvelle classe de cette classe à partir de l'itérable. OrderedDict le démontre en utilisant la même méthode:
La méthode class utilise des informations sur la classe (et non une instance de cette classe) pour affecter le type de classe à renvoyer.
Méthodes statiques
Vous mentionnez une méthode qui "ne connaît pas sa classe" - il s'agit d'une méthode statique en Python. Il est simplement attaché par commodité à l'objet de classe. Il pourrait éventuellement s'agir d'une fonction distincte dans un autre module, mais sa signature d'appel serait la même.
Une méthode statique n'est une fonction ni de la classe ni de l'objet.
Str.maketrans de Python 3 est un exemple intégré de méthode statique.
À partir de quelques arguments, il crée un dictionnaire qui n'est pas une fonction de sa classe.
C'est pratique car il
str
est toujours disponible dans l'espace de noms global, vous pouvez donc l'utiliser facilement avec la fonction de traduction:En Python 2, vous devez y accéder depuis le
string
module:Exemple
Instancions:
Maintenant, l'instance peut appeler toutes les méthodes:
Mais la classe n'est généralement pas destinée à appeler la méthode d'instance, bien qu'elle soit appelée aux autres:
Vous devez explicitement passer l'instance pour appeler la méthode d'instance:
la source
MyClass(1,2,3)
mais plutôt, commeMyClass.get_special(1,2,3)
), et une méthode statique être une fonction normale qui pourrait rester seule de toute façon.Une "méthode d'instance" est une méthode qui obtient l'objet instance en tant que premier paramètre appelé par convention
self
. C'est la valeur par défaut.Une "méthode statique" est une méthode sans
self
paramètre initial . Ceci est mis en œuvre avec le décorateur @staticmethod .Une "méthode de classe" est une méthode dans laquelle le paramètre initial n'est pas un objet d'instance, mais un objet de classe ( voir cette partie de la documentation Python pour connaître ce qu'est un "objet de classe"), appelé par convention
cls
. Ceci est mis en œuvre avec le décorateur @classmethod .L'utilisation typique du terme "méthode statique" dans C / C ++ / etc s'applique aux méthodes Python "statique" et Python "classe", car ces deux types de méthodes ne font pas référence à l'instance. En C / C ++ / etc, les méthodes ont normalement un accès implicite à tous les membres / méthodes de la classe ne faisant pas d’instance, ce qui explique probablement pourquoi cette distinction n’existe que dans des langages tels que Python / Ruby / etc.
la source
Class::staticMethod()
et c'est tout (tant que vous n'êtes pas interdit d'appeler parce questaticMethod()
c'est privé ou quelque chose comme ça).