52 votes

Pourquoi python utilise-t-il deux traits de soulignement pour certaines choses?

Je suis assez nouveau à de véritables langages de programmation, et Python est mon premier. Je sais que mon chemin autour de Linux, un peu, assez pour obtenir un emploi d'été avec elle (je suis encore au lycée), et sur le travail, j'ai beaucoup de temps libre que j'ai choisi d'apprendre le langage Python.

Une chose est arriver moi si. Qu'est-ce exactement est différent en Python lorsque vous avez des expressions telles que

x.__add__(y) <==> x+y
x.__getattribute__('foo') <==> x.foo

Je sais quelles sont vos méthodes et des trucs, et j'obtiens ce qu'ils font, mais ma question est: Comment sont celles trait de soulignement double méthodes ci-dessus différente de la leur plus simple à la recherche d'équivalents?

P. S., je ne me dérange pas étant donné des conférences sur la programmation de l'histoire, en fait, je trouve ça très utile à savoir :) Si ce sont principalement les aspects historiques de Python, n'hésitez pas à commencer la randonnée.

30voto

Steven Rumbalski Points 16838

Ici est le créateur de Python à l'expliquer:

... plutôt que de concevoir une nouvelle syntaxe pour types de méthodes de la classe (par exemple comme les initialiseurs et destructeurs), je décidé que ces fonctions pourraient être traitée simplement en demandant à l'utilisateur pour mettre en œuvre des méthodes spéciales des noms tels que __init__, __del__, et ainsi de suite. Cette convention de nommage a été prises à partir de C où les identificateurs en commençant par des caractères de soulignement sont réservés par le compilateur et ont souvent des spéciaux sens (par exemple, les macros telles que __FILE__ dans le préprocesseur C).

...

J'ai aussi utilisé cette technique pour permettre les classes de l'utilisateur de redéfinir le comportement de Python opérateurs. Comme précédemment a noté, le Python est implémenté en C et utilise des tables de pointeurs de fonction à mettre en œuvre différentes capacités de les objets intégrés (par exemple, "obtenir l'attribut", "ajouter" et "call"). Pour permettre à ces capacités à être défini dans les classes définies par l'utilisateur, j'ai mappé les différents pointeurs de fonction spéciales les noms de méthodes telles que l' __getattr__, __add__, et __call__. Il y a un la correspondance directe entre ces les noms et les tables de la fonction les pointeurs on a définir lors de l' la mise en œuvre de nouveaux objets Python en C.

16voto

mipadi Points 135410

Lorsque vous démarrez une méthode avec deux traits de soulignement (et pas de fuite souligne), Python est le nom d'amputation des règles sont appliquées. C'est une façon de vaguement simuler l' private mot-clé à partir d'autres langages à objets comme C++ et Java. (De même, la méthode est toujours techniquement pas privé dans la façon dont Java et C++ méthodes sont privées, mais il est "plus difficile" à partir de l'extérieur de l'instance.)

Méthodes avec les deux grands et deux de fuite des traits de soulignement sont considérés comme des "built-in" méthodes, c'est, ils sont utilisés par l'interprète, et sont généralement des implémentations concrètes de la surcharge des opérateurs ou d'autres fonctionnalités intégrées.

7voto

delnan Points 52260

Ainsi, le pouvoir pour le programmeur est bon, donc il devrait y avoir un moyen de personnaliser le comportement. Comme la surcharge d'opérateur (__add__, __div__, __ge__, ...), attribut d'accès (__getattribute__, __getattr__ (les deux sont différentes), __delattr__, ...), etc. Dans de nombreux cas, comme les opérateurs, la syntaxe habituelle des cartes de 1:1 à la méthode. Dans d'autres cas, il existe une procédure qui implique l'appel de la méthode choisie - par exemple, __getattr__ n'est appelée que si l'objet n'a pas demandé de l'attribut et de l' __getattribute__ n'est pas mis en œuvre ou soulevé AttributeError. Et certains d'entre eux sont vraiment des sujets avancés qui vous deeeeep dans l'objet du système de tripes et sont rarement nécessaires. Donc pas besoin de les apprendre tous, juste consulter l'ouvrage de référence lorsque vous avez besoin/envie de savoir. En parlant de référence, ici il est.

4voto

Paul Nathan Points 22910

Ils sont utilisés pour spécifier que l'interpréteur Python doit les utiliser dans des situations spécifiques.

Par exemple, la fonction __add__ permet à l'opérateur + de travailler pour des classes personnalisées. Sinon, vous obtiendrez une sorte d'erreur non définie lors de la tentative d'ajout.

3voto

William Pursell Points 56211

D'un point de vue historique, les principaux traits de soulignement ont souvent été utilisé comme une méthode pour indiquer au programmeur que les noms doivent être considérés comme internes à l'emballage/module/de la bibliothèque qui les définit. Dans les langues qui ne sont pas d'offrir un bon soutien pour les espaces de noms, à l'aide de traits de soulignement est une convention à émuler. En Python, lorsque vous définissez une méthode nommée '__foo__ "l'entretien programmeur sait le nom de quelque chose de spécial qui se passe qui n'est pas le cas avec une méthode nommée "foo". Si Python a choisi d'utiliser "ajouter" que la méthode interne de surcharge '+', alors vous pourriez ne jamais avoir une classe avec une méthode "ajouter" sans causer beaucoup de confusion. Les traits de soulignement servir de repère que de la magie qui va arriver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X