python @property @staticmethod
PHP中文网
PHP中文网 2017-04-18 09:04:34
0
1
817

这两个东西在什么情况下用

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(1)
伊谢尔伦

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 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.

  1. La partie concise est que vous n'avez pas besoin de recevoir un argument supplémentaire qui n'a pas d'importance

  2. 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 :)


Questions auxquelles j'ai répondu : Python-QA

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal