Wie Python-Klassen und magische Methoden funktionieren.

Abstruction

Python verfügt über Methoden wie init und len, die durch methodanme dargestellt werden. Python wird mit __ Methoden betrieben. Ich werde erklären, wie diese in Python funktionieren. In diesem Artikel erfahren Sie, wie Python funktioniert und nicht wie es verwendet wird.

Introduction of __

Verwenden Sie zuerst len, wenn Sie die Länge eines Objekts in Python ermitteln möchten. Sie können es wie im folgenden Beispiel schreiben.

>>> len("hello")
5
>>> len([1, 2, 3])
3
>>> len({'a': 1, 'b': 2})
2
>>> len((1, 2, 3))
3

Wie funktioniert das eigentlich?

>>> "hello".__len__() # string
5
>>> [1, 2, 3].__len__() # list
3
>>> {'a': 1, 'b': 2}.__len__() # dict
2
>>> (1, 2, 3).__len__() # tuple
3

Sie können die Länge des Objekts ermitteln, indem Sie "len ()" im Inneren aufrufen. Das heißt, die Funktion len () ruft das __len__ des Objekts auf. Es funktioniert eher nach dem, was das Objekt selbst hat, als nach einer Python-Funktion.

Lassen Sie uns mylen implementieren, um das oben Gesagte zu bestätigen.

>>> def mylen(object):
...     'Return length of the object'
...     return object.__len__()
...
>>> mylen("hello")
5
>>> mylen([1, 2, 3])
3
>>> mylen({'a': 1, 'b': 2})
2
>>> mylen((1, 2, 3))
3

So rufen Sie __membername__ auf

Wie spricht man __len__ aus?

#Lassen Sie uns zunächst jedes Symbol genau aussprechen.
__len__
=> underbar underbar len underbar underbar #lange!
#Lassen wir die letzte Unterleiste unter der Unterleiste weg.
=> underbar underbar len #lange!!
#Da es am Anfang zwei Unterbalken gibt, fügen wir double hinzu.
=> double underbar len #Nein, es ist noch lang!!!
#Kombinieren Sie Double und Underbar, um einen neuen Namen zu erhalten.
=> dunder len
#Am Ende wird es also dunder len ausgesprochen.
#Ebenso ist es üblich, privat darzustellen`_membername`Ebenfalls
_foo
=> single underbar foo
#Bleib auf die gleiche Weise
=> sunder foo
#sunder foo Ausgesprochen Thunder foo.

Andere dunder Beispiele

Python arbeitet, indem es das dunder-Mitglied des Objekts aufruft. Selbst wenn Sie beispielsweise den Operator "+" verwenden, wird dies mit dieser Dunder-Methode erreicht.

>>> 1 + 20
21
>>> (1).__add__(20)
21

Beim Aufruf mit object [index] wird dunder get item aufgerufen.

>>> "hello"[0]
'h'
>>> "hello".__getitem__(0)
'h'

Definieren Sie Ihre eigene Klasse

Python arbeitet mit der Dunder-Methode. Sie können die Klasse tatsächlich selbst definieren und Ihr Verständnis vertiefen.

Hundeklasse definieren

class Dog:

Konstruktor mit dunder init definieren

Nehmen wir diesmal an, Sie haben Namen und Größe. Es ist dem Sunder-Namen bzw. der Sunder-Höhe zugeordnet.

    def __init__(self, name, height):
        self._name = name
        self._height = height

Methode Funktion Rinde

Dies ist eine normale Methode, keine mit Dunder.

    def bark(self):
        print 'Woof!  %s is barking' % self._name
        

Rinde kann so genannt werden.

>>> dog = Dog("foo", 123)
>>> dog.bark()
Woof!  foo is barking

dunder len Diesmal gibt die Länge der Dog-Instanz die im Konstruktor übergebene Höhe zurück.

    def __len__(self):
        return height

Es wird von der eingebauten Funktion len so aufgerufen.

>>> dog = Dog("foo", 123)
>>> len(dog)
123
>>> dog.__len__()
123

dunder getitem Dieses Mal, wenn es größer als die Länge der Hundeinstanz ist (in diesem Fall die Sunder-Höhe), wird ein "IndexError" ausgelöst. Der Rückgabewert ist der Index multipliziert mit 111.

    def __getitem__(self, index):
        if index >= len(self):
            raise IndexError('Oops, index out of range')
        return index * 111

Es kann mit Dog [index] aufgerufen werden.

>>> dog = Dog("foo", 123)
>>> dog[1]
111
>>> dog[2]
222
>>> dog[234]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "class_demo.py", line 18, in __getitem__
    raise IndexError('Oops, index out of range')
IndexError: Oops, index out of range
>>> dog.__getitem__(1)
111
>>> dog.__getitem__(2)
222
>>> dog.__getitem__(234)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "class_demo.py", line 18, in __getitem__
    raise IndexError('Oops, index out of range')
IndexError: Oops, index out of range

dunder call

Eine Dog-Instanz definiert eine Funktion, die ausgeführt werden soll, wenn () aufgerufen wird.

    def __call__(self, action):
        if action == 'fetch':
            return '%s is fetching' % self.name
        elif action == 'owner':
            return 'Giwa'
        else:
            raise ValueError('Unknown action')

Sie können es mit Dog ("string") nennen.

>>> dog = Dog("foo", 123)
>>> dog('fetch')
'foo is fetching'
>>> dog('owner')
'Giwa'
>>> dog('name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "class_demo.py", line 27, in __call__
    raise ValueError('Unknown action')
ValueError: Unknown action
>>> dog.__call__('fetch')
'foo is fetching'
>>> dog.__call__('owner')
'Giwa'
>>> dog.__call__('name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "class_demo.py", line 27, in __call__
    raise ValueError('Unknown action')
ValueError: Unknown action

dunder add

Wenn Hundeinstanzen erstellt werden, fügen Sie sowohl Namen als auch Höhen hinzu und verwenden Sie diese als Argumente, um eine neue Hundeinstanz zu erstellen.

    def __add__(self, other):
        newname = self._name + '~' + other._name
        newheight = self._height + other._height
        return Dog(newname, newheight)

Der Operator + ruft dunder add auf.

>>> dog1 = Dog("foo", 10)
>>> dog2 = Dog("bar", 20)
>>> dog3 = dog1 + dog2
>>> dog3.bark()
Woof!  foo~bar is barking
>>> len(dog3)
30
>>> dog4 = dog1.__add__(dog2)
>>> dog4.bark()
Woof!  foo~bar is barking
>>> len(dog4)
30

dunder str

Es wird verwendet, wenn es von "str ()" oder "print" aufgerufen wird.

    def __str__(self):
        return 'I am a dog named %s' % self._name

Es heißt so.

>>> dog = Dog('foo', 123)
>>> str(dog)
'I am a dog named foo'
>>> print dog
I am a dog named foo
>>> dog.__str__()
'I am a dog named foo'

Ganzer Code

'Demonstrate how Python classes and magic methods work'

class Dog:
    'A simple canine class'

    def __init__(self, name, height):
        self._name = name
        self._height = height

    def bark(self):
        print 'Woof!  %s is barking' % self.name

    def __len__(self):
        return self._height

    def __getitem__(self, index):
        if index >= len(self):
            raise IndexError('Oops, index out of range')
        return index * 111

    def __call__(self, action):
        if action == 'fetch':
            return '%s is fetching' % self._name
        elif action == 'owner':
            return 'Giwa'
        else:
            raise ValueError('Unknown action')

    def __add__(self, other):
        newname = self._name + '~' + other._name
        newheight = self._height + other._height
        return Dog(newname, newheight)

    def __str__(self):
        return 'I am a dog named %s' % self._name

Zusammenfassung

Recommended Posts

Wie Python-Klassen und magische Methoden funktionieren.
Python-Klassen und -Instanzen, Instanzmethoden
Binden Sie Methoden an Python-Klassen und -Instanzen
Python-Klassen sind langsam
Informationen zu Python-Objekten und -Klassen
ABC für Python-Abstract-Klassen und Ententypisierung
[Python] Was sind @classmethod und Dekorateure?
[Python] Über Executor und zukünftige Klassen
So verpacken und verteilen Sie Python-Skripte
So installieren und verwenden Sie pandas_datareader [Python]
Private Methoden und Felder in Python [Verschlüsselung]
Python: Verwendung von Einheimischen () und Globalen ()
[Python] Berechnen von MAE und RMSE
Verwendung von Python zip und Aufzählung
Apropos alte und neue Klassen in Python
Verwendung ist und == in Python
Python open und io.open sind gleich
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
So generieren Sie eine Sequenz in Python und C ++
[Einführung in Python3 Tag 12] Kapitel 6 Objekte und Klassen (6.3-6.15)
Studie aus Python Hour7: Verwendung von Klassen
Organisieren Sie die Bedeutung von Methoden, Klassen und Objekten
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
[Einführung in Python3 Tag 11] Kapitel 6 Objekte und Klassen (6.1-6.2)
[Hikari-Python] Kapitel 09-02 Klassen (Erstellen und Instanziieren von Klassen)
Was vergleichst du mit Python und ==?
[Python] Verwendung von Hash-Funktion und Taple.
Fasst jede der Markov-Ketten- und Monte-Carlo-Methoden zusammen
Was sind Python Taples und * Args?
Wie man Autokorrelation und partielle Autokorrelation mit Python zeichnet
Das einfachste Python-Memo in Japan (Klassen und Objekte)
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
Erstellen einer R- und Python Docker-Arbeitsumgebung
[Python] So sortieren Sie Diktate in Listen und Instanzen in Listen
[Python] So teilen und modularisieren Sie Dateien (einfach, Beispiel)
[Python] So erstellen Sie eine Korrelationsmatrix und eine Heatmap
Das von Python berechnete VIF und das von Excel berechnete VIF sind unterschiedlich.
Python # So überprüfen Sie Typ und Typ für Super-Anfänger
[Python] Arten statistischer Werte (Features) und Berechnungsmethoden
Verwenden Sie Python, um Windows und Mac zu überwachen und Informationen zu den Apps zu sammeln, an denen Sie arbeiten
Vorgehensweise zum Ausleihen und Ausleihen von JS-Methoden (die verwendete Methode) in Python