Comment fonctionnent les classes python et les méthodes magiques.

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

Comment appeler __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.

Autres exemples de dunder

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'

Définissez votre propre classe

Python fonctionne en utilisant la méthode dunder. Vous pouvez définir vous-même la classe et approfondir votre compréhension.

Définir la classe de chien

class Dog:

Définir le constructeur avec dunder init

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

Méthode fonction aboiement

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'

Code entier

'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

Résumé

Recommended Posts

Comment fonctionnent les classes python et les méthodes magiques.
Classes et instances Python, méthodes d'instance
Lier des méthodes aux classes et instances Python
Les classes Python sont lentes
À propos des objets et des classes Python
ABC pour les classes abstraites Python et la saisie de canard
[Python] Que sont @classmethod et les décorateurs?
[Python] À propos des classes Executor et Future
Comment empaqueter et distribuer des scripts Python
Comment installer et utiliser pandas_datareader [Python]
Méthodes et champs privés en python [chiffrement]
python: Comment utiliser les locals () et globals ()
[Python] Comment calculer MAE et RMSE
Comment utiliser le zip Python et énumérer
Parler d'anciennes et de nouvelles classes en Python
Comment utiliser is et == en Python
Python open et io.open sont les mêmes
Conseils pour ceux qui ne savent pas comment utiliser is et == en Python
Comment générer une séquence en Python et C ++
[Introduction à Python3 Jour 12] Chapitre 6 Objets et classes (6.3-6.15)
Étude de Python Hour7: Comment utiliser les classes
Organiser la signification des méthodes, des classes et des objets
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
[Introduction à Python3 Jour 11] Chapitre 6 Objets et classes (6.1-6.2)
[Hikari-Python] Chapitre 09-02 Classes (Création et instanciation de classes)
Que comparez-vous avec Python et ==?
[Python] Comment utiliser la fonction de hachage et taple.
Résumé de chacune des méthodes de la chaîne de Markov et de Monte Carlo
Que sont les taples et * args python après tout?
Comment tracer l'autocorrélation et l'autocorrélation partielle avec Python
Le mémo Python le plus simple au Japon (classes et objets)
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Création d'un environnement de travail Docker R et Python
[Python] Comment trier un dict dans une liste et une instance dans une liste
[Python] Comment fractionner et modulariser des fichiers (simple, exemple)
[Python] Comment créer une matrice de corrélation et une carte thermique
Le VIF calculé par Python et le VIF calculé par Excel sont différents .. ??
Python # Comment vérifier le type et le type pour les super débutants
[Python] Types de valeurs statistiques (caractéristiques) et méthodes de calcul
Utilisez Python pour surveiller Windows et Mac et collecter des informations sur les applications sur lesquelles vous travaillez
Comment faire "Prêter et emprunter des méthodes JS (celle qui utilise s'appliquent)" en Python