Bien que les variables de classe soient accessibles dans les compréhensions de liste dans les définitions de fonctions, elles ne sont pas accessibles dans les compréhensions de liste dans les définitions de classe . Cette différence vient du fait que les portées de classe ne s'étendent pas aux compréhensions de liste ou à d'autres portées incluses telles que les expressions génératrices ou les définitions de fonctions.
Au lieu de cela, les compréhensions de liste et autres expressions similaires ont leur propre portée locale, les empêchant d'accéder variables définies dans les étendues de classe englobantes. Ce comportement est cohérent dans toutes les versions de Python.
Pour accéder aux variables de classe dans une compréhension de liste au sein d'une définition de classe, vous pouvez utiliser l'une des solutions de contournement suivantes :
Considérons l'exemple suivant :
class Foo: x = 5 # Error in Python 3: 'NameError: name 'x' is not defined' y = [x for i in range(1)]
Pour utiliser la variable de classe x dans cet exemple , vous pouvez utiliser l'une des solutions de contournement suivantes :
Utilisation d'un function :
def get_y(x): return [x for i in range(1)] y = get_y(x)
Utilisation de __init__ pour créer une variable d'instance :
def __init__(self): self.y = [self.x for i in range(1)]
Malgré les solutions de contournement susmentionnées, il est généralement recommandé d'éviter d'accéder aux variables de classe à partir des compréhensions de liste dans les définitions de classe. Cette pratique peut entraîner de la confusion et des erreurs potentielles, en particulier lors de la collaboration avec d'autres développeurs.
Pour une approche plus propre et plus maintenable, envisagez d'utiliser des fonctions ou des variables d'instance au lieu de compréhensions de liste pour accéder aux variables de classe dans une définition de classe.
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!