Pythons magische Methoden sind die vordefinierten Funktionen vom Typ __XXX__
in Python.
Der größte Vorteil der Verwendung der magischen Methoden von Python besteht darin, dass Python einfache Methoden bereitstellt, mit denen sich Objekte wie integrierte Typen verhalten.
__str__
-Funktion wird verwendet, um den Ausgabeinhalt beim Drucken der Instanz selbst zu verarbeiten. Wenn diese Funktion nicht überschrieben wird, werden standardmäßig ein Objektname und eine Speicheradresse ausgegeben.
Zum Beispiel:
>>> class Student(object): ... def __init__(self,name): ... self._name = name ... >>> print Student()
Ausgabe: <__main__.Student object at 0x0000000002A929E8>
.
Wie machen wir also die Ausgabeergebnisse lesbarer? Wir können die Funktion __str__
überschreiben. Das Ausgabeergebnis von
>>> class Student(object): ... def __init__(self, name): ... self._name = name ... def __str__(self): ... return "I'm a student, named %s" % self._name ... >>> print Student("Charlie")
lautet beispielsweise: I'm a student, named Charlie
.
Wenn wir die Funktion str()
auf das Objekt anwenden, rufen wir tatsächlich die Funktion __str__
des Objekts auf.
__repr__
serialisiert auch Objekte, aber __repr__
ist eher für den Python-Compiler sichtbar. __str__
Es geht mehr um die Lesbarkeit.
Wenn wir die Funktion repr()
auf ein Objekt anwenden, rufen wir tatsächlich die Funktion __repr__
dieser Funktion auf.
gepaart mit repr()
ist die Funktion eval()
. eval()
Die Funktion besteht darin, das serialisierte Objekt wieder in ein Objekt umzuwandeln. Voraussetzung ist, dass das Objekt die Funktion __repr__
implementiert.
Der obige Absatz basiert auf meinem eigenen Verständnis, ich weiß nicht, ob er richtig oder falsch ist.
>>> item = [1,2,3] >>> repr(item) '[1, 2, 3]' >>> other_item = eval(repr(item)) >>> other_item[1] 2
Wir verwenden oft for...in..., um Listen oder Tupeln zu iterieren. Das heißt, die Liste erbt von Iterable. Iterable implementiert die Funktion __iter__.
Um ein benutzerdefiniertes Objekt in ein iterierbares Objekt umzuwandeln, müssen Sie zwei Methoden implementieren: __iter__
und next
.
__iter__
Die Funktion gibt ein Objekt zurück. Beim Iterieren wird die Funktion next
fortlaufend aufgerufen, um den nächsten Wert abzurufen, bis StopIteration
erfasst und gestoppt wird.
Das Tutorial von Lehrer Liao Xuefeng schreibt die __next__
Methode, ich weiß nicht warum.
class Fib(object): def __init__(self): self.a, self.b = 0, 1 def __iter__(self): return self def next(self): self.a, self.b = self.b, self.a + self.b if self.a > 10000: raise StopIteration return self.a for i in Fib(): print i
Das Obige implementiert die Objektiteration durch Implementierung der __iter__
-Funktion.
So implementieren Sie das Objekt, um Elemente per Index zu extrahieren.
Dies geschieht durch die Implementierung der __getitem__
-Methoden des Objekts.
Lass uns eins schenken