• [^] # Re: Petite bizarrerie à noter

    Posté par (site web personnel) . En réponse au journal écrire du code dans le corps d'une classe python. Évalué à 10.

    Python n'a que 2 espaces de noms : global et local.

    Donc :

    # global
    class Foo:
     # local
     def meth(self):
     # local (mais un nouveau local, pas celui au dessus)
     ...

    Quand une variable n'est pas définie dans l'espace de nom "local", Python le cherche dans l'espace de nom "global". Dans ton exemple, x n'existe pas dans "global", d'où l'erreur.

    Le corps de la classe est exécuté lors de la création de la classe, mais le corps de la méthode est exécuté que lorsqu'elle est appelée, l'espace de nom du corps de la classe n'existe donc plus à ce moment là.

    Il faut imaginer que ce qu'il se passe c'est ça :

    def Foo_meth(self):
     return x
    def make_Foo():
     return type("Foo", tuple(), {"x": 0, "meth": Foo_meth})
    Foo = make_Foo()
    foo = Foo()
    foo.meth()

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg