Maison  >  Article  >  développement back-end  >  L'autonomie est-elle redondante en python ?

L'autonomie est-elle redondante en python ?

anonymity
anonymityoriginal
2019-06-14 16:18:572409parcourir

self représente une instance d'une classe, pas une classe.

L'autonomie est-elle redondante en python ?

Regardons d'abord un exemple :

class Test:
  def prt(self):
    print(self)
    print(self.__class__)
  
t = Test()
t.prt()

Le résultat de l'exécution est le suivant

<__main__.Test object at 0x000000000284E080>
<class &#39;__main__.Test&#39;>

From Il ressort clairement de l'exemple ci-dessus que self représente une instance d'une classe. Et self.class pointe vers la classe.

Puis-je ne pas m'écrire ?

Dans l'interpréteur Python, lorsque nous appelons t.prt(), Python l'interprète en fait comme Test.prt(t ), c'est-à-dire remplacer self par une instance de la classe.

Réécrivez la ligne t.prt() ci-dessus, et les résultats réels après l'exécution seront exactement les mêmes.

En fait, il a été partiellement expliqué que self ne peut pas être omis lors de la définition

class Test:
  def prt():
    print(self)
  
t = Test()
t.prt()

L'erreur de rappel d'exécution est la suivante : prt n'a pas de paramètres lors de la définition, mais un paramètre est passé de force lors de la définition. exécution.

Puisque t.prt() est équivalent à Test.prt(t) comme expliqué ci-dessus, le programme rappelle qu'un paramètre t supplémentaire est passé.

Traceback (most recent call last):
 File "h.py", line 6, in <module>
  t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given

Ce n'est pas grave si vous ne transmettez pas une instance de classe lors de sa définition ou de son appel, c'est une méthode de classe.

class Test:
  def prt():
    print(__class__)
Test.prt()

Les résultats en cours d'exécution sont les suivants

<class &#39;__main__.Test&#39;>

Lors de l'héritage, l'instance transmise est l'instance transmise, et non l'instance de la classe dans laquelle self est défini.

Regardez d'abord le code

class Parent:
  def pprt(self):
    print(self)
  
class Child(Parent):
  def cprt(self):
    print(self)
c = Child()
c.cprt()
c.pprt()
p = Parent()
p.pprt()

Les résultats d'exécution sont les suivants

<__main__.Child object at 0x0000000002A47080>
<__main__.Child object at 0x0000000002A47080>
<__main__.Parent object at 0x0000000002A47240>

Explication :

Vous ne devriez pas comprendre quand l'exécution de la question c.cprt() fait référence à une instance de la classe Child.

Mais lors de l'exécution de c.pprt(), c'est équivalent à Child.pprt(c), donc self fait toujours référence à une instance de la classe Child Puisque la méthode pprt() n'est pas définie dans self,

En regardant l'arbre d'héritage, nous avons constaté que la méthode pprt() est définie dans la classe parent Parent, elle sera donc appelée avec succès.

Résumé

Self doit être défini lors de la définition, mais il sera automatiquement transmis lors de l'appel. Le nom de

self n'est pas rigide, mais il est préférable d'utiliser self selon la convention

self fait toujours référence à l'instance de la classe lors de l'appel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn