Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Studiennotizen – magische Methode, um benutzerdefinierte Klassen mehr wie integrierte Typen zu machen

Python-Studiennotizen – magische Methode, um benutzerdefinierte Klassen mehr wie integrierte Typen zu machen

高洛峰
高洛峰Original
2017-02-18 10:46:021187Durchsuche

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

__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_ Funktion

__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

__iter__-Funktion

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

__getitem__-Funktion

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn