stef d a posé la question dans Informatique et internetProgrammation · il y a 2 mois

en python pourquoi un code s'execute dans la zone class.?

par exemple :

class test:

        print("toto")

        tutu="tete"

        pass

print("end")

print(test.tutu)

a comme résultat :

toto

end

tete

je me serais attendu a ne pas voir le code print("toto") etre executé tant que je n'ai pas appelé la class.

quelqu'un peut m'expliquer?

2 réponses

Évaluation
  • oyubir
    Lv 6
    il y a 2 mois
    Réponse favorite

    Appeler la classe ?

    Ce n'est pas une fonction.

    Enfin, si, c'est est une. Mais pas contenant le code qu'on trouve dans la zone class.

    Une classe est un objet appelable. Et l'appeler appelle le constructeur. Ici il n'y en a pas.

    class Test:

         def __init__(self):

              print("world")

         print("hello")

    Ici, "world" ne sera affiché que quand la classe sera appelée, c'est à dire quand on construira une instance.

    untest=Test()

    va avoir comme effet de bord d'afficher "world". Parce que cela appelle le constructeur Test.__init__

    Comprenez bien que

    1. La définition des classes, comme des fonctions est dynamique. La classe n'existe (n'est définie, pour utiliser le vocabulaire d'autres langages) que lorsque le code "class..." est interprété.

    Exactement comme une fonction n'existe que lorsque le code "def ..." est interprété.

    2. Pour que les méthodes de la classe existent, il faudra donc bien que le code contenu dans la zone class soit exécuté.

    Quand vous écrivez

    class Test:

         def methode(self):

              qqc

    vous espérez bien que la méthode "methode" existe, non ? Donc que le code situé dans la zone "class Test" soit exécuté, puisque c'est lui qui définit ces méthodes.

    Le mot clé class ne fait que deux choses (enfin, non, plus. Mais on peut ne retenir que ces 2 choses pour votre question) :

    1. Créer une nouvelle classe (qui en python est un objet comme un autre. "class Test" crée un objet de type class nommé Test, exactement comme "x=1" crée un objet de type entier nommé x, ou def f() crée un objet de type fonction, nommé f.

    2. Créer un espace de nommage, dans lequel sera inclus tous les objets que vous créez

    Donc

    class Test:

         x=1

    A pour effet de créer non pas une variable globale x, mais une variable Test.x (une variable locale à l'espace de nommage cité, qui est accessible comme champ de l'objet classe cité)

    class Test:

         def methode(self):

              qqc

    A pour effet de créer non pas une fonction globale methode, mais une fonction locale à cet espace de nommage Test.methode (c'est tout ce qu'une méthode est en python : une fonction locale à une classe).

    Et c'est tout ce que fait ce mot "class". Le code qui y est présent est exécuté comme d'habitude. Sauf que quand ce code crée des variables, ces variables sont créés dans l'espace de nommage associé à la classe.

    (à ne pas confondre avec l'espace de nommage associé à ses instances, qu'on récupère via "self")

    Donc,

    class Test:

         nimportequelcode

    Exécute nimportequelcode. Mais si nimportequelcode crée un nouveau symbole X (via X=... ou def X()...), au lieu que ce symbole soit un symbole global, ce sera un symbole accessible via la classe : Test.X

    Si nimportequelcode est un print, le print est exécuté.

    Bref, pour créer un exemple minimal reproduisant le comportement qui vous étonne

    class Test:

         print("hello")

    Afficher "hello", puisque le code est exécuté. Et comme ce code ne crée aucune variable, cela n'aura aucune autre conséquence.

  • Anonyme
    il y a 2 mois

    Et qu'est-ce qu'il se passe en boa ?

Vous avez d’autres questions ? Pour obtenir des réponses, posez vos questions dès maintenant.