Frage

Ich bin ziemlich neu in aktuellen Programmiersprachen und Python ist mein erster. Ich kenne mich in Linux ein wenig, genug, um einen Job für den Sommer mit ihm zu bekommen (ich bin immer noch in der High School), und auf dem Arbeitsmarkt, habe ich eine Menge freier Zeit, die ich verwende Python zu lernen.

Eine Sache ist schon immer mir aber. Was genau ist anders in Python, wenn Sie Ausdrücke wie

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

Ich weiß, was Methoden tun und solche Sachen, und ich bekommen, was sie tun, aber meine Frage ist: Wie diese Doppelstrich oben genannten Methoden unterscheiden sich von ihrer einfacheren Suche Äquivalente

P. S., Ich habe nicht auf die Programmierung Geschichte wird referierte dagegen, in der Tat, ich habe es sehr nützlich zu wissen :) Wenn diese hauptsächlich historische Aspekte von Python sind, fühlen sich frei, Wandern zu beginnen.

War es hilfreich?

Lösung

Nun, Kraft für den Programmierer ist gut, so sollte es eine Art und Weise anpassen Verhalten sein. Wie Betreiber Überlastung (__add__, __div__, __ge__, ...), Attribut-Zugang (__getattribute__, __getattr__ (die zwei differnt sind), __delattr__, ...) usw. In vielen Fällen, wie Operatoren, ordnet die übliche Syntax 1: 1 auf das entsprechende Verfahren. In anderen Fällen gibt es ein spezielles Verfahren, das an einem gewissen Punkt beinhaltet die jeweilige Methode aufrufen - zum Beispiel wird __getattr__ nur aufgerufen, wenn das Objekt nicht über das angeforderte Attribut und __getattribute__ ist nicht implementiert oder Attribut angehoben. Und einige von ihnen sind wirklich fortgeschrittene Themen, die Sie deeeeep in den Eingeweiden des Objekts System erhalten und werden nur selten benötigt. Also keine Notwendigkeit, sie alle zu lernen, fragen Sie einfach die Referenz, wenn Sie brauchen / wollen wissen. Apropos Referenz, hier ist es .

Andere Tipps

Hier ist der Schöpfer von Python erklären sie :

  

..., anstatt eine neue Syntax Konzeption für   spezielle Arten von Klassenmethoden (z   wie initializers und Destruktoren), I   entschieden, dass diese Funktionen sein könnte   durch einfache dass der Benutzer behandelt   zu implementieren Methoden mit speziellem   Namen wie __init__, __del__ und   so weiter. Diese Namenskonvention war   von C genommen, wo Identifikatoren   mit Unterstrichen Ausgangs sind reserviert   durch den Compiler und haben oft besondere   Bedeutung (zum Beispiel Makros wie   __FILE__ in dem C-Präprozessor).

...

  

Ich habe auch diese Technik zu ermöglichen,   Benutzerklassen das Verhalten neu zu definieren   von Pythons Operatoren. Wie zuvor   erwähnt wurde, wird in Python C umgesetzt und   verwendet Tabellen von Funktionszeigern   implementieren verschiedene Fähigkeiten   integrierte Objekte (zum Beispiel „get   Attribut“,‚add‘und‚call‘). Zu   zulassen, dass diese Fähigkeiten definiert werden   in benutzerdefinierten Klassen, Mapped I die   verschiedene Funktionszeiger auf spezielle   Verfahren Namen wie __getattr__,   __add__ und __call__. Da ist ein   direkte Entsprechung zwischen diesen   Namen und die Tabellen der Funktion   Zeiger muss man definieren, wenn   Implementierung neuer Python-Objekte in C.

Wenn Sie eine Methode mit zwei Unterstrichen beginnen (und ohne Hinter Unterstrichen), Python Name Regeln Mangeln angewendet werden. Dies ist ein Weg, um lost das private Stichwort aus anderen OO-Sprachen wie C ++ und Java simulieren. (Trotzdem ist das Verfahren noch technisch nicht privat in der Weise, dass Java und C ++ Methoden sind privat, aber es ist „härter zu bekommen“ von außerhalb der Instanz.)

Methoden mit zwei führenden und zwei Längs Unterstrichen werden als „integrierten“ Methoden sein, das heißt, sie werden vom Interpreter verwendet und sind in der Regel die konkreten Implementierungen von überladenen Operatoren oder andere integrierte Funktionalität.

Sie werden verwendet, um festzulegen, dass der Python-Interpreter sie in bestimmten Situationen verwenden sollte.

z. B. ermöglicht die __add__ Funktion den + Betreiber für benutzerdefinierte Klassen an der Arbeit. Sonst werden Sie irgendeine Art von nicht definierten Fehler, wenn hinzuzufügen versuchen.

Aus historischen Sicht haben führende Unterstrichen oft als Verfahren verwendet, um den Programmierer, um anzuzeigen, dass die Namen intern sind zu beachten, um das Paket / Modul / Bibliothek, die definiert sie. In Sprachen, die für private Namespaces eine gute Unterstützung bieten keine, Unterstrichen verwendet, ist eine Konvention, die zu emulieren. In Python, wenn Sie eine Methode namens ‚__foo__‘ die Wartung Programmierer weiß, aus dem Namen definieren, dass etwas Besonderes, an dem wird nicht mit einer Methode namens ‚foo‘ geschieht. Wenn Python zu verwenden ‚add‘ als interne Methode zur Überlastung gewählt hatte ‚+‘, dann könnte man nie eine Klasse mit einer Methode ‚Add‘ haben, ohne viel Verwirrung verursacht. Die Unterstrichen dienen als Hinweis, dass einige Magie passieren wird.

Eine Reihe von anderen Fragen werden nun als Duplikate dieser Frage markiert, und mindestens zwei von ihnen fragen, was entweder die __spam__ Methoden aufgerufen werden, oder das, was die Konvention genannt wird, und keine der vorhandenen Antworten dass, so:

Es gibt eigentlich keinen offiziellen Namen für entweder.

Viele Entwickler sie inoffiziell nennen „dunder Methoden“, für „Double Unterstrich“.

Einige Leute den Begriff „magische Methoden“ verwenden, aber das ist nicht ganz eindeutig zwischen dunder Methoden Sinn, spezielle Methoden (siehe unten), oder etwas irgendwo zwischen den beiden.


Es ist ein offizieller Begriff „besondere Attribute“, die eng überlappt aber nicht vollständig mit dunder Methoden. Die Datenmodell Kapitel in der Referenz nie ganz erklärt, was ein spezielles Attribut, aber die Grundidee ist, dass es mindestens eine der folgenden ist:

  • Ein Attribut, das vom Interpreter selbst oder seinem eingebauten Code, wie __name__ auf einer Funktion versehen ist.
  • Ein Attribut, dass der Teil eines Protokoll vom Interpreter implementiert selbst, wie __add__ für den + Operator oder __getitem__ für die Indizierung und Schneiden.
  • Ein Attribut, dass der Interpreter erlaubt ist speziell nachschlagen, durch die Instanz zu ignorieren und direkt in die Klasse gehen, wie __add__ wieder.

Die besonderen Eigenschaften sind Methoden, aber nicht alle (beispielsweise __name__ nicht ist). Und die meisten nutzen die "dunder" Konvention, aber nicht alle (beispielsweise die next Methode auf Iteratoren in Python 2.x).

Und in der Zwischenzeit der meisten dunder Methoden sind spezielle Attribute, aber nicht alles in allem ist es nicht ungewöhnlich, stdlib oder externe Bibliotheken zu wollen, ihre eigenen Protokolle zu definieren, die auf die gleiche Weise arbeiten, wie die pickle Protokoll

[Speculation] wurde Python beeinflusst von Algol68 , Guido möglicherweise Algol68 an der University of Amsterdam verwendet wo Algol68 hat ein ähnlicher „ pampig Regime “ „Zitat Abledern“ genannt. In Algol68 die Operatoren, Typen und keywords kann erscheint in einer anderen Schriftart (in der Regel ** fett ** oder __ unterstreicht __), in Sourcecode-Dateien diese Schrift wird mit Zitaten erreicht, zB 'Abs' (Zitat ähnlich zu zitieren in ' wikitext ')

Algol68 ? Python (Operatoren zugeordnet Member-Funktionen)

  • 'und' ? __and __
  • 'oder' ? __or __
  • 'nicht' ? nicht
  • 'entier' ? __trunc __
  • 'shl' ? __lshift __
  • 'shr' ? __rshift __
  • 'upb' ? __sizeof __
  • 'long' ? __long __
  • 'int' ? __int __
  • 'real' ? __float __
  • 'format' ? __format __
  • 'repr' ? __repr __
  • 'abs' ? __abs __
  • 'minus' ? __neg __
  • 'minus' ? __sub __
  • 'plus' ? __add __
  • 'mal' ? __mul __
  • 'mod' ? __mod __
  • 'div' ? __truediv __
  • 'über' ? __div __
  • 'up' ? __pow __
  • 'im' ? imag
  • 're' ? echt
  • 'conj' ? Konjugat

In Algol68 diese wurden bezeichnet als fett Namen , z.B. abs , aber "unter-under-abs" __abs__ in Python.

Meine 2 Cent: ¢ Also manchmal - wie ein Geist - wenn Sie Ausschneiden und Einfügen Python-Klassen in einem Wiki Sie reincarnate magisch Algol68 fett Keywords. ¢

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top