J'ai examiné de plus près pourquoi l'auto Python est nécessaire

Qu'est-ce que self, qui est le premier argument d'une méthode de classe?

Quand j'étudie une classe, je pense que la première grande barrière est ** Pourquoi devrais-je utiliser "self" comme argument de méthode? **.

Je pense qu'il est souvent convaincu que c'est une règle, alors mettons-le en place, mais je pense que ce n'est pas convaincant pour les débutants qui veulent bien comprendre la structure et passer à autre chose.

Je viens moi-même de commencer à étudier Python, mais j'ai finalement arrêté d'apprendre à utiliser selt. C'est parce que je me suis dit: «Dites-moi pourquoi vous l'utilisez!» Et je ne veux pas que cela soit de mauvaise humeur.

C'est probablement une règle, donc je ne pense pas que ce sera trop difficile de procéder, mais je veux tout de même la comprendre correctement, alors j'ai résumé le contenu de l'apprentissage. Je suis aussi l'un des débutants, j'ai donc essayé de faire la description autant que possible pour que les débutants puissent la comprendre.

Pour cette étude, l'explication de ce site était la plus convaincante, donc je l'ai résumé comme référence.

Vérifiez si c'est vraiment inutile si vous n'entrez pas en soi

Tout d'abord, je pensais que je n'avais pas besoin de moi, alors j'ai écrit la source sans utiliser de moi.

class Person:
    def __init__(name):
        p_name = name
        
    def introduce():
        print("je" + p_name + "est.")

player = Person("Taro")
player.introduce()

① Passez l'argument "Taro" à la classe lors de la création de l'instance "player" (2) "Taro" est assigné à la variable p_name par le constructeur (initialisation / traitement dans init). ③ La méthode d'introduction renvoie "Je suis Taro" (devrait)

Si vous essayez ceci, le résultat sera:

Traceback (most recent call last):
  File "Main.py", line 25, in <module>
    player = Person("Taro")
TypeError: __init__() takes 1 positional argument but 2 were given
(Exit status: 1)

Le processus ne semble pas être faux, mais pour une raison quelconque, j'obtiens une erreur. .. .. joueur = Personne (" Taro ") Il semble qu'une erreur se soit produite dans le traitement de. Vous devez avoir transmis correctement les arguments à la classe.

** Cependant, si vous regardez le message d'erreur ici, vous le trouverez intéressant. ** **

TypeError: __init__() takes 1 positional argument but 2 were given

Qu'est-ce que ça veut dire? ** "La méthode init ne peut prendre qu'une seule variable, pourquoi en spécifiez-vous deux?" ** Il est dit que.

Non, vous n'avez qu'une seule variable, non? Qu'est-ce que tu racontes? Est-ce un bogue Python?

D'autre part, réécrivez le code selon les «règles» et exécutez-le.

class Person:
    def __init__(self,name):
        self.name = name
        
    def introduce(self):
        print("je" + self.name + "est.")

player = Person("Taro")
player.introduce()

Quand j'essaye de faire ça.

Je suis Taro

Il semble qu'il soit correctement émis. La différence entre les deux codes est de savoir si vous incluez le soi ou non, mais si vous incluez le soi, cela fonctionne correctement. Je ne suis toujours pas sûr, alors veuillez vous référer à ce site pour découvrir pourquoi le traitement est différent comme celui-ci. en pensant.

Apparemment, il y a un argument caché

Dans le traitement du code qui ne spécifie pas de soi plus tôt TypeError: __init__() takes 1 positional argument but 2 were given J'ai eu l'erreur, mais quelle en était la signification?

** "La méthode init ne peut accepter qu'un seul argument, pourquoi en spécifiez-vous deux?" **

C'était ça. En d'autres termes, si vous retournez le contraire de ceci,

** "S'il y a deux arguments de la méthode init, elle peut être traitée sans aucun problème" **

En d'autres termes, dans la méthode de spécification de player = Person (" Taro "), deux arguments sont en fait spécifiés, mais dans la fonction init, un seul argument, name, est spécifié. Par conséquent, une erreur s'est produite.

La clé pour comprendre soi-même est que lorsque vous spécifiez player = Person (" Taro "), vous passez ** une autre variable cachée **.

Cela signifie que vous devez spécifier def __init __ (nazo, nom) dans la description de la fonction init. Il y a un mystérieux argument que je ne comprends pas bien, alors essayez de spécifier l'argument "nazo".

class Person:
    def __init__(nazo,name):
        nazo.name = name
        
    def introduce(nazo):
        print("je" + nazo.name + "est.")

player = Person("Taro")
player.introduce()

Quand j'essaye de faire ça.

Je suis Taro

cette?

Ce n'est pas de soi, mais c'est passé. Oui, il semble que ce ne soit pas nécessairement ** soi **.

Ce que nous avons appris jusqu'à présent, c'est qu'il existe un argument mystérieux et qu'il peut être traité en entrant dans l'argument mystérieux. Et l'argument n'a pas à être le soi.

Ça sentait que je pourrais l'atteindre bientôt.

Qu'est-ce qui est exactement passé comme argument

À titre d'exemple, considérons une fonction qui met en majuscule les lettres «python». La fonction à mettre en majuscule est dans la classe str (une classe préparée à l'origine en Python) et peut être traitée à l'aide de la fonction supérieure.

La fonction supérieure est définie dans la classe comme def upper (object): et peut être appelée comme str.upper (object).

string = "python"
print(str.upper(string))

Si vous faites cela, vous obtiendrez la sortie PYTHON.

Cependant, personne ne convertirait en majuscules avec une telle description. Peut-être que beaucoup écriraient un code comme celui-ci pour le processus de capitalisation.

string = "python"
print(string.upper())

Si vous faites cela, vous obtiendrez toujours la sortie PYTHON.

D'après l'explication de ici, il semble que la description ** string.upper (string) soit difficile à voir en python, alors arrêtons. Vous pouvez omettre l'argument de chaîne, mais en coulisses, supposons que l'argument est pris correctement **.

Maintenant, quel est l'argument omis est la chaîne elle-même, c'est-à-dire "I = self".

Le point est, ** Lorsque vous utilisez une méthode à partir d'un objet, vous pouvez omettre l'argument de l'objet. Cependant, il est normal de l'omettre, et je l'obtiendrai secrètement comme argument dans les coulisses! Il semble que python ait une règle de **.

Ce que je veux dire, c'est ** Lorsque l'instance de joueur créée précédemment utilise la méthode appelée introduire, elle doit être écrite comme player.introduce (player), mais l'argument player est omis. Ensuite, vous pouvez écrire player.introduce (). Au lieu de cela, cela signifie qu'il est omis dans la description et que l'argument lui-même n'a pas disparu, de sorte que la classe obtiendra l'argument comme "self" sans permission **.

C'est-à-dire, de la même manière, si vous décrivez la méthode init par commodité lors de son utilisation (elle est exécutée arbitrairement car c'est un constructeur), elle devrait être ** player.init (player," Taro "). Il doit être **, mais il peut être omis de la même manière, donc du côté de l'instance, vous pouvez écrire player = Person ("Taro"). Au lieu de cela, la classe doit obtenir l'argument omis, donc la classe doit définir "self" comme argument.

Sur cette base, regardons à nouveau la classe Person.

class Person:
    def __init__(nazo,name):
        nazo.name = name
        
    def introduce(nazo):
        print("je" + nazo.name + "est.")

player = Person("Taro")
player.introduce()

Ce que vous pouvez dire à partir de ce code source est ** Voulez-vous utiliser la méthode init de la classe Person? Ensuite, vous pouvez omettre l'argument "vous (self)", mais comme il est seulement autorisé à être omis, la classe obtiendra l'argument (self) correctement **.

Je pense qu'un exemple facile à comprendre est "La boutique de classes Python autorise les chemins de visage pour les instances".

Quand une instance appelée `player entre dans une boutique de classe, vous devez normalement écrire votre nom sur la liste, mais il est censé être" Parce que vous êtes une personne familière, vous pouvez utiliser une passe de visage! " .. Cependant, en tant que boutique de classe, je voudrais mentionner que le joueur est venu pour la gestion des ventes. ''

J'ai finalement eu la réponse, ** self est l'instance elle-même **. Normalement, vous devez indiquer correctement le nom (joueur) pour l'utiliser, mais comme la passe face est autorisée, vous n'avez pas à l'écrire un par un. Cependant, je veux que vous l'écriviez comme une règle réelle, donc dans la classe, self est défini comme argument.

Enfin, je voudrais vérifier à nouveau le code source. J'ai écrit "nazo" plus tôt, mais puisque l'instance elle-même est l'argument, "self" est préférable.

class Person:
    #Si vous souhaitez utiliser la fonction init, vous pouvez utiliser le chemin du visage, mais j'écrirai le nom ici.
    #Sinon, vous ne saurez pas qui vous êtes.
    def __init__(self,name):
    #"tu(self)de"J'écrirai le nom ici.
        self.name = name
     
    #C'est une passe faciale, vous pouvez donc l'utiliser sans autorisation, mais je ne sais pas qui l'a utilisée, alors j'écrirai mon nom ici.
    def introduce(self):
        print("je" + self.name + "est.")

player = Person("Taro")
player.introduce()

Épilogue

C'est peut-être difficile à comprendre car c'est un débutant, mais je pense que ce n'est pas grave si vous vous en souvenez avec une telle image. Si vous voulez en savoir un peu plus, [ce site](https://python.ms/self/#%E7%96%91%E5%95%8F-%E3%81%AA%E3%82%93%E3 % 81% A7% E6% 98% 8E% E7% A4% BA% E7% 9A% 84% E3% 81% AB-auto-% E3% 82% 92% E6% 9B% B8% E3% 81% 8F% E3% 81% AE% EF% BC% 9F) est bien, mais c'est difficile pour les débutants, il semble donc préférable de le relire après avoir atteint le niveau intermédiaire ou supérieur. Je pouvais comprendre la moitié, mais je ne comprenais pas encore la moitié.

J'espère que même une personne qui apprend Python ne trébuchera pas en lisant cet article.

Recommended Posts

J'ai examiné de plus près pourquoi l'auto Python est nécessaire
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python
Pourquoi le découpage Python est représenté par un deux-points (:)
J'ai appris Python avec une belle fille à Paiza # 02
J'ai jeté un œil au contenu de sklearn (scikit-learn) (1) ~ Qu'en est-il de l'implémentation de CountVectorizer? ~
Pourquoi le premier argument de la classe [Python] est-il self?
Regardez de plus près le tutoriel Kaggle / Titanic
Pourquoi j'ai choisi Python
Jetez un œil à l'arborescence des exceptions intégrée à Python
La liste Python n'est pas une liste
J'ai fait un texte Python
Jetez un œil à l'arborescence des exceptions intégrée dans Python 3.8.2
J'ai fait beaucoup de recherches sur la façon dont Python est exécuté
i! i! ← Ceci est une formule
J'ai fait un Line-bot avec Python!
Jetez un œil au modèle Django.
J'ai fait une loterie avec Python.
J'ai suivi le cours d'apprentissage Python I de Progete
J'ai créé un démon avec Python
Quel est le fichier XX à la racine d'un projet Python populaire?