2009-06-01 9 views
35

Quelle est la différence entre __method__, method et _method__?Différence entre "__method__" et "méthode"

Y at-il une ou pour une raison aléatoire que les gens pensaient que __doc__ devrait être juste comme ça au lieu de doc. Qu'est-ce qui rend une méthode plus spéciale que l'autre?

Répondre

72

du guide de style:

  • _single_leading_underscore: faible indicateur "usage interne". Par exemple. from M import * ne pas importer les objets dont le nom commence par un trait de soulignement.

  • single_trailing_underscore_: utilisé par convention pour éviter les conflits avec Mot-clé Python, par ex.

    Tkinter.Toplevel(master, class_='ClassName') 
    
  • __double_leading_underscore: lorsque vous nommez un attribut de classe, nom mangling invoque (dans la classe FooBar, __boo devient _FooBar__boo, voir ci-dessous).

  • __double_leading_and_trailing_underscore__: objets "magiques" ou attributs qui résident dans des espaces de noms contrôlés par l'utilisateur. Par exemple. __init__, __import__ ou . Ne jamais inventer de tels noms; utilisez-les seulement comme documenté.

+6

__method n'est pas vraiment privé, il est tronqué avec le nom de la classe mais il est toujours accessible normalement. +1 cependant. –

+0

@Bastien - merci d'avoir amélioré la mise en forme! –

+1

-1. parce que __x n'est pas privé au sens OOP, et ce n'est pas le but. Le but est d'éviter deux classes utilisant le même attribut par erreur. C'est la remise d'espace de noms, plutôt que privé/protégé. –

0

Les méthodes préfacées et préfixées avec le double trait de soulignement sont généralement si marquées pour indiquer qu'elles font partie de la spécification du langage Python.

1

Ces méthodes ont été nommées en tant que telles afin de réduire la possibilité de nommer les collisions.

0

Certaines méthodes avec un double préfixe et le suffixe underscore sont spéciaux. Par exemple, __init__ est appelée chaque fois qu'une instance de cette classe est créée et __str__ est appelée lorsque l'objet doit être imprimé. Fondamentalement, ils peuvent être appelés de manière spéciale. Vous pouvez les utiliser comme n'importe quelle autre méthode, ou vous pouvez les invoquer de la manière spéciale qui leur est associée.

Je ne connais pas les fonctions globales de double-trait de soulignement (n'appartenant à aucune classe), mais je pense qu'il n'y en a pas.

4

Ce sont toutes des conventions, donc elles ne sont pas appliquées de toute façon. Pourtant, vous pouvez normalement attendre:

__somename__ 

Quelque chose défini dans la spécification du langage Python lui-même. Ne l'utilisez pas dans votre propre nom.

_somename 

Ceci est normalement supposé être appelé via un mécanisme différent plutôt que directement. Semblable à la déclaration de quelque chose de privé dans la plupart des autres langues, mais non appliquée de quelque façon que ce soit.

__somename 

C'est vraiment pas censé être appelé directement, et est mutilée en interne pour vous cesser de le faire par mégarde. Si vous avez vraiment besoin de l'appeler pour une raison quelconque, consultez la documentation pour savoir comment.

Tout ce qui précède peut s'appliquer également aux noms de fonctions, de variables ou de classes.

0

Le motif de __name__ indique des méthodes "magiques". Ceux-ci sont appelés par différentes fonctions comme

str(x) -> x.__str__() 
repr(x) -> x.__repr__() 
x[0] -> x.__getitem__(0) 
etc 

Un préfixe de soulignement simple est d'indiquer un attribut privé, et n'est suivi par convention. Un préfixe à deux traits de soulignement initialise le nom-mangling, où l'attribut nommé __attr est remplacé par __Class_attr lors de l'instanciation.

Le motif que vous avez de _method__ n'est vraiment pas utilisé pour quoi que ce soit.

19
  • method est juste une méthode normale
  • _method ne doit pas être appelé à moins que vous savez ce que vous faites, ce qui signifie normalement que vous avez écrit vous-même la méthode.
  • __method les 2 traits de soulignement sont utilisés pour empêcher le dénigrement des noms. Les attributs ou les méthodes de ce type sont accessibles via instance._ClassName__method. Bien que beaucoup de gens appellent cela "privé", il est pas. Vous ne devriez jamais utiliser ceci pour empêcher quelqu'un d'accéder à cette méthode, utilisez _method à la place.
  • __method__ est utilisé pour les méthodes spéciales qui modifient le comportement de l'instance. Ne nommez pas vos propres méthodes comme celle-ci.
Questions connexes