Abstruction
Python a des méthodes telles que «init» et «len» qui sont représentées par methodanme. Python est alimenté par __ méthodes. Je vais vous expliquer comment cela fonctionne en Python. Cet article vise à comprendre comment fonctionne Python, plutôt que comment l'utiliser.
Introduction of __
Tout d'abord, utilisez len
lorsque vous voulez obtenir la longueur d'un objet en Python. Vous pouvez l'écrire comme l'exemple ci-dessous.
>>> len("hello")
5
>>> len([1, 2, 3])
3
>>> len({'a': 1, 'b': 2})
2
>>> len((1, 2, 3))
3
Comment cela fonctionne-t-il réellement?
>>> "hello".__len__() # string
5
>>> [1, 2, 3].__len__() # list
3
>>> {'a': 1, 'b': 2}.__len__() # dict
2
>>> (1, 2, 3).__len__() # tuple
3
Vous pouvez obtenir la longueur de l'objet en appelant __len__ ()
à l'intérieur. Autrement dit, la fonction len ()
appelle le __len__
de l'objet. Cela fonctionne en fonction de ce que l'objet lui-même a, plutôt que d'une fonction Python.
Implémentons mylen
pour confirmer ce qui précède.
>>> 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__
Comment prononcez-vous «len»?
#Tout d'abord, prononçons chaque symbole avec précision.
__len__
=> underbar underbar len underbar underbar #longue!
#Oublions le dernier underbar underbar.
=> underbar underbar len #longue!!
#Puisqu'il y a deux underbars au début, ajoutons double.
=> double underbar len #Non, c'est encore long!!!
#Combinez double et underbar pour lui donner un nouveau nom.
=> dunder len
#Donc, à la fin, il est prononcé dunder len.
#De la même manière, il est d'usage de représenter des`_membername`Aussi
_foo
=> single underbar foo
#Tenez-vous de la même manière
=> sunder foo
#sunder foo Prononcé Thunder foo.
Python fonctionne en appelant le membre dunder de l'objet.
Par exemple, même si vous utilisez l'opérateur +
, cela est réalisé en utilisant cette méthode dunder.
>>> 1 + 20
21
>>> (1).__add__(20)
21
Lorsqu'il est appelé avec ʻobject [index] `, dunder get item est appelé.
>>> "hello"[0]
'h'
>>> "hello".__getitem__(0)
'h'
Python fonctionne en utilisant la méthode dunder. Vous pouvez définir vous-même la classe et approfondir votre compréhension.
class Dog:
Cette fois, disons que vous avez le nom et la taille. Il est attribué respectivement au nom et à la hauteur du bris.
def __init__(self, name, height):
self._name = name
self._height = height
C'est une méthode normale, pas une utilisant dunder.
def bark(self):
print 'Woof! %s is barking' % self._name
l'écorce peut être appelée ainsi.
>>> dog = Dog("foo", 123)
>>> dog.bark()
Woof! foo is barking
dunder len Cette fois, la longueur de l'instance Dog renvoie la hauteur passée dans le constructeur.
def __len__(self):
return height
Il est appelé par la fonction intégrée len
comme ceci.
>>> dog = Dog("foo", 123)
>>> len(dog)
123
>>> dog.__len__()
123
dunder getitem Cette fois, si elle est plus grande que la longueur de l'instance de chien (hauteur de séparation dans ce cas), nous lèverons ʻIndexError`. La valeur de retour est un index multiplié par 111.
def __getitem__(self, index):
if index >= len(self):
raise IndexError('Oops, index out of range')
return index * 111
Il peut être appelé avec Dog [index].
>>> 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
Une instance Dog définit une fonction à exécuter lorsque () est appelé.
def __call__(self, action):
if action == 'fetch':
return '%s is fetching' % self.name
elif action == 'owner':
return 'Giwa'
else:
raise ValueError('Unknown action')
Vous pouvez l'appeler avec Dog ("string").
>>> 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
Si des instances Dog sont créées, ajoutez à la fois des noms et des hauteurs et prenez-les comme arguments pour créer une nouvelle instance Dog.
def __add__(self, other):
newname = self._name + '~' + other._name
newheight = self._height + other._height
return Dog(newname, newheight)
L'opérateur + appelle dunder add.
>>> 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
Il est utilisé lorsqu'il est appelé par str ()
ou print
.
def __str__(self):
return 'I am a dog named %s' % self._name
Cela s'appelle ainsi.
>>> 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
se prononce Thunder Fu__len__
se prononce comme DanderlenRecommended Posts