@property est un décorateur utilisé pour remplacer les getters/setters en Python. Il peut envelopper, traiter et encapsuler les attributs de classe, et il peut également créer facilement des attributs en lecture seule. Le point clé est qu'il a conservé une interface simple. Parce que nous pouvons accéder aux propriétés de manière intuitive sans avoir à utiliser des getters/setters fastidieux tels que get_XXX et set_XXX. Au départ, je voulais écrire une explication complète, mais après y avoir réfléchi, j'ai senti qu'elle n'était pas assez complète, alors j'ai abandonné et j'ai attendu de la compléter à l'avenir. S'il y a d'autres experts qui connaissent bien ce domaine, n'hésitez pas. libre de donner à l'interlocuteur et à moi quelques opinions.
@staticmethod Je pense que c'est d'aucune utilité pratique décorateur non essentiel (si vous avez des opinions différentes à ce sujet, bienvenue pour en discuter, je veux vraiment pour en discuter) )
(Cette réponse est un peu plus difficile. Si vous avez du mal à lire en chinois traditionnel, vous pouvez utiliser votre navigateur pour le convertir en chinois simplifié et le lire...)
@méthodestatique
Fonctionnalités et scénarios d'utilisation
Parlons d'abord de staticmethod. Eh bien, la méthode modifiée par staticmethod ne recevra pas le premier argument spécial (méthode d'instance générale et méthode modifiée par classmethod strong>Category). méthodes accepteront respectivement les références d'instance et de catégorie comme premier paramètre), ce qui fait de la méthode statique une fonction normale, sauf qu'elle est définie dans la classe plutôt que directement au niveau du module.
Donc, sa situation d'utilisation est : lorsque la fonction dans une classe ne nécessite pas d'instance ou de classe telle que self ou cls Lors du référencement , l'utilisation de méthodes statiques peut terminer le travail de manière plus concise et efficace.
La partie concise est que vous n'avez pas besoin de recevoir un argument supplémentaire qui n'a pas d'importance
L'efficacité réside dans le fait que la méthode d'instance générale est une méthode liée (un objet) et est générée lorsque nous voulons l'utiliser. Cela coûtera un peu plus cher, mais pas la méthode statiquep >
Pratique/pas pratique ?
Mais je pense que ce n'est pas pratique. Tout d'abord, nous pouvons utiliser classmethod pour les fonctions directement liées aux classes. Dans le code, nous nous appuyons sur la référence de classe fournie par le premier argument. pour terminer les opérations liées à la classe (comme le remplacement de __init__ ou comme méthode de niveau supérieur qui distribue plus de sous-classes de staticmethod).
Si cela n'est pas lié à la classe (et n'a rien à voir avec l'instance), alors nous avons besoin du but de la méthode statique de catégorie. Je ne peux penser qu'à un seul pour le moment : avoir un niveau abstrait. dans l'appel (oui, je parle de namespace) Bien que cette fonction ne contacte pas directement la classe, elle est liée à la classe.
Mais en Python, il est très simple d'utiliser namespace. On pourrait aussi bien définir la fonction que l'on voulait initialement définir comme une méthode statique au niveau du module, et la placer dans le bon emplacement. catégorie autant que possible à proximité, je pense que c'est largement suffisant (avis de Luciano Ramalho).
Réflexion
Juste après avoir fini de taper le paragraphe ci-dessus, j'ai lu spécifiquement un excellent article de Julien Danjou : Le guide définitif sur la façon d'utiliser les méthodes statiques, de classe ou abstraites en Python I Cet article est fortement recommandé aux toute personne souhaitant comprendre les méthodes Python.
Cet article met en avant deux avantages de la staticmethod. Le premier point que j'ai mentionné ci-dessus est que les méthodes statiques sont plus concises et efficaces que les méthodes d'instance. Le deuxième point est que les méthodes statiques n'ont rien à voir avec la classe mais appartiennent à la classe, ce qui signifie qu'elles peuvent personnaliser les services pour la classe. C'est un peu difficile à comprendre, regardons un exemple (exemple dans l'article de Julien Danjou) :
classe Pizza(objet) :
@méthodestatique
def mix_ingredients(x, y):
retourner x + y
cuisinier par déf (auto):
return self.mix_ingredients(self.cheese, self.vegetables)
Imaginons que si nous définissons mix_ingredients au niveau du module, alors lorsque nous traiterons des sous-classes qui héritent de Pizza, nous ne pourrons pas modifier mix_ingredients pour changer le comportement des ingrédients mélangés (car cette fonction est utilisée par d'autres classes), nous devons alors remplacer cook.
Cette raison m'a légèrement fait changer d'avis. Au moins, il a souligné la plus grande différence entre une méthode statique et une méthode générale Les méthodes statiques appartiennent à une certaine catégorie.
Cependant, je m'en tiens toujours à mon idée originale, car peut-être que mix_ingredients peut être mieux écrit, ou peut-être que pour des catégories non abstraites comme Pizza, nous ne devrions pas du tout en hériter, ou peut-être en hériter. Ce n'est pas bon de remplacer les méthodes, et je pourrais même trouver que changer mix_ingredients est aussi fastidieux que changer cook.
Résumé
Les éléments ci-dessus sont tous je pense. Peut-être qu'un jour la staticmethod sera utilisée d'une manière vraiment élégante, je peux admettre mon ignorance et ma compréhension superficielle aujourd'hui. Quant à vous ? Je pense que vous pouvez avoir vos propres idées. Tant que vous pouvez vous convaincre après en avoir suffisamment connu, alors je ne pense pas qu'aucune position soit mauvaise :)
En bref
@property
est un décorateur utilisé pour remplacer les getters/setters en Python. Il peut envelopper, traiter et encapsuler les attributs de classe, et il peut également créer facilement des attributs en lecture seule. Le point clé est qu'il a conservé une interface simple. Parce que nous pouvons accéder aux propriétés de manière intuitive sans avoir à utiliser des getters/setters fastidieux tels queget_XXX
etset_XXX
. Au départ, je voulais écrire une explication complète, mais après y avoir réfléchi, j'ai senti qu'elle n'était pas assez complète, alors j'ai abandonné et j'ai attendu de la compléter à l'avenir. S'il y a d'autres experts qui connaissent bien ce domaine, n'hésitez pas. libre de donner à l'interlocuteur et à moi quelques opinions.@staticmethod
Je pense que c'estd'aucune utilité pratiquedécorateur non essentiel (si vous avez des opinions différentes à ce sujet, bienvenue pour en discuter, je veux vraiment pour en discuter) )(Cette réponse est un peu plus difficile. Si vous avez du mal à lire en chinois traditionnel, vous pouvez utiliser votre navigateur pour le convertir en chinois simplifié et le lire...)
@méthodestatique
Fonctionnalités et scénarios d'utilisation
Parlons d'abord de
staticmethod
. Eh bien, la méthode modifiée par staticmethod ne recevra pas le premier argument spécial (méthode d'instance générale et méthode modifiée parclassmethod
strong>Category). méthodes accepteront respectivement les références d'instance et de catégorie comme premier paramètre), ce qui fait de la méthode statique une fonction normale, sauf qu'elle est définie dans la classe plutôt que directement au niveau du module.Donc, sa situation d'utilisation est : lorsque la fonction dans une classe ne nécessite pas d'instance ou de classe telle que
self
oucls
Lors du référencement , l'utilisation de méthodes statiques peut terminer le travail de manière plus concise et efficace.La partie concise est que vous n'avez pas besoin de recevoir un argument supplémentaire qui n'a pas d'importance
L'efficacité réside dans le fait que la méthode d'instance générale est une méthode liée (un objet) et est générée lorsque nous voulons l'utiliser. Cela coûtera un peu plus cher, mais pas la méthode statiquep >
Pratique/pas pratique ?
Mais je pense que ce n'est pas pratique. Tout d'abord, nous pouvons utiliser
classmethod
pour les fonctions directement liées aux classes. Dans le code, nous nous appuyons sur la référence de classe fournie par le premier argument. pour terminer les opérations liées à la classe (comme le remplacement de__init__
ou comme méthode de niveau supérieur qui distribue plus de sous-classes destaticmethod
).Si cela n'est pas lié à la classe (et n'a rien à voir avec l'instance), alors nous avons besoin du but de la méthode statique de catégorie. Je ne peux penser qu'à un seul pour le moment : avoir un niveau abstrait. dans l'appel (oui, je parle de namespace) Bien que cette fonction ne contacte pas directement la classe, elle est liée à la classe.
Mais en Python, il est très simple d'utiliser
namespace
. On pourrait aussi bien définir la fonction que l'on voulait initialement définir comme une méthode statique au niveau du module, et la placer dans le bon emplacement. catégorie autant que possible à proximité, je pense que c'est largement suffisant (avis de Luciano Ramalho).Réflexion
Juste après avoir fini de taper le paragraphe ci-dessus, j'ai lu spécifiquement un excellent article de Julien Danjou :
Le guide définitif sur la façon d'utiliser les méthodes statiques, de classe ou abstraites en Python
I Cet article est fortement recommandé aux toute personne souhaitant comprendre les méthodes Python.
Cet article met en avant deux avantages de la
staticmethod
. Le premier point que j'ai mentionné ci-dessus est que les méthodes statiques sont plus concises et efficaces que les méthodes d'instance. Le deuxième point est que les méthodes statiques n'ont rien à voir avec la classe mais appartiennent à la classe, ce qui signifie qu'elles peuvent personnaliser les services pour la classe. C'est un peu difficile à comprendre, regardons un exemple (exemple dans l'article de Julien Danjou) :Imaginons que si nous définissons
mix_ingredients
au niveau du module, alors lorsque nous traiterons des sous-classes qui héritent dePizza
, nous ne pourrons pas modifiermix_ingredients
pour changer le comportement des ingrédients mélangés (car cette fonction est utilisée par d'autres classes), nous devons alors remplacercook
.Cette raison m'a légèrement fait changer d'avis. Au moins, il a souligné la plus grande différence entre une méthode statique et une méthode générale Les méthodes statiques appartiennent à une certaine catégorie.
Cependant, je m'en tiens toujours à mon idée originale, car peut-être que
mix_ingredients
peut être mieux écrit, ou peut-être que pour des catégories non abstraites comme Pizza, nous ne devrions pas du tout en hériter, ou peut-être en hériter. Ce n'est pas bon de remplacer les méthodes, et je pourrais même trouver que changermix_ingredients
est aussi fastidieux que changercook
.Résumé
Les éléments ci-dessus sont tous je pense. Peut-être qu'un jour la
staticmethod
sera utilisée d'une manière vraiment élégante, je peux admettre mon ignorance et ma compréhension superficielle aujourd'hui. Quant à vous ? Je pense que vous pouvez avoir vos propres idées. Tant que vous pouvez vous convaincre après en avoir suffisamment connu, alors je ne pense pas qu'aucune position soit mauvaise :)Questions auxquelles j'ai répondu : Python-QA