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
__membername__
aufWie 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.
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'
Python arbeitet mit der Dunder-Methode. Sie können die Klasse tatsächlich selbst definieren und Ihr Verständnis vertiefen.
class Dog:
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
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'
'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
_foo
wird Thunder Fu ausgesprochen__len__
wird als Danderlen ausgesprochenRecommended Posts