Heim >Backend-Entwicklung >Python-Tutorial >Python-Magic-Methode: Machen Sie benutzerdefinierte Klassen eher zu integrierten Typen

Python-Magic-Methode: Machen Sie benutzerdefinierte Klassen eher zu integrierten Typen

黄舟
黄舟Original
2017-02-04 17:09:081602Durchsuche

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? Tuch? Wir können die Funktion __str__ überschreiben. Zum Beispiel:

>>> class Student(object):
...     def __init__(self, name):
...             self._name = name
...     def __str__(self):
...             return  "I&#39;m a student, named %s" % self._name
...
>>> print Student("Charlie")


Das Ausgabeergebnis ist:

I&#39;m a student, named Charlie.


Wir wenden str() an Funktion zum Objekt hinzufügt, wird tatsächlich die __str__-Funktion des Objekts aufgerufen.


__repr__-Funktion


__repr__ serialisiert auch Objekte, aber __repr__ Mehr für den Python-Compiler . __str__ ist besser lesbar.


Wenn wir die Funktion repr() auf ein Objekt anwenden, rufen wir tatsächlich die Funktion __repr__ der Funktion auf.


Gepaart mit repr() ist die Funktion eval(). Die Funktion eval() wandelt das serialisierte Objekt wieder in ein Objekt um. 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)
&#39;[1, 
2, 3]&#39;
>>> other_item = eval(repr(item))
>>> other_item[1]
2

__iter__-Funktion


Wir verwenden oft for...in... für Listen oder Tupel zum Iterieren. Das heißt, die Liste erbt von Iterable. Iterable implementiert die Funktion __iter__.


Wenn Sie ein benutzerdefiniertes Objekt in ein iterierbares Objekt umwandeln möchten, müssen Sie zwei Methoden implementieren: __iter__ und next.


Die Funktion __iter__ gibt ein Objekt zurück. Beim Iterieren wird die nächste Funktion kontinuierlich aufgerufen, um den nächsten Wert abzurufen, bis StopIteration erfasst 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 wird durch die Implementierung der __iter__-Funktion erreicht Iteration von Objekten.


So implementieren Sie ein Objekt, um Elemente per Index zu extrahieren.


Dies geschieht durch Implementierung der __getitem__-Methode 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