2017-03-11 2 views
0

ich Python zu lernen, und ich bin ein Problem mit Verständnis Thema class habe, so Ich mag würde ein paar Fragen stellenAutomatische Anruf von Methoden in der Klasse

  • was ist der Unterschied zwischen hash() und __hash__() ?
  • Wenn ich Funktionen (zum Beispiel __init__()) in class definiere, werden sie automatisch aufgerufen oder muss ich sie explizit aufrufen?
  • in class, gibt es einen Unterschied bei der Definition einer reservierten Funktion (def __hash__():) und meiner eigenen Funktion (def foo():)?

Vielen Dank!

+1

Welche Quelle verwenden Sie, wenn Sie Python lernen? Eine anständige Einführung sollte erklären, wie es funktioniert. Die Frage ist zu weit gefasst, da eine angemessene Antwort eine große Menge an Erklärungen erfordern würde und einfach dazu dienen würde, Material zu reproduzieren, das in zahlreichen Tutorials/Büchern leicht zu finden ist. Ich stimme zu, diese Frage als zu weit zu schließen. –

Antwort

1

Spezielle Methoden (manchmal magische Methoden genannt) wie __hash__ und __new__ werden indirekt über verschiedene Mechanismen aufgerufen.

Zum Beispiel, wenn Sie __hash__ auf eine Klasse Foo und instanzierte Objekt foo der Klasse definiert haben:

hash(foo) 

Wird Ihr __hash__ Methode aufrufen.

Ein weiteres Beispiel ist __new__ und __init__

Foo() 

Mittelbar die __new__ rufen und __init__ auf Ihrer Klasse definiert. Zuerst wird __new__ aufgerufen, die eine Instanz zurückgeben soll. Die __init__-Methode behandelt die Initialisierung Ihrer Instanz und gibt None zurück. Sie müssen sehr selten __new__ für Ihre Klasse implementieren, es sei denn, Sie möchten den Prozess der Instanzerstellung irgendwie überschreiben. Dies geschieht normalerweise, wenn Sie Metaklassen definieren oder unveränderliche Typen überschreiben.

Andere Arten von speziellen Methoden zur Überladen von Operatoren verwendet werden, wie __eq__

foo==bar 

indirekt Ihre Definition von __eq__ mit dem Bar Argumente nennen.

+0

Wenn du über '__new__' redest, solltest du'__init__' wirklich erklären und warum fast immer'__init__' anstelle von' _neu__' verwenden. –

+0

Ich meinte '__init__' nicht '__new__', danke für die Korrektur. – Vasil

Verwandte Themen