Maison > développement back-end > Tutoriel Python > Pourquoi ne puis-je pas accéder aux variables de classe directement dans les compréhensions de liste au sein d'une définition de classe en Python ?

Pourquoi ne puis-je pas accéder aux variables de classe directement dans les compréhensions de liste au sein d'une définition de classe en Python ?

Patricia Arquette
Libérer: 2024-12-26 22:26:17
original
291 Les gens l'ont consulté

Why Can't I Access Class Variables Directly in List Comprehensions Within a Class Definition in Python?

Accès aux variables de classe à partir des compréhensions de liste dans les définitions de classe

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.

Solutions de contournement

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 :

  • Utilisez une fonction explicite : Définissez une fonction au sein de la classe qui prend la variable de classe comme argument. La compréhension de liste peut alors utiliser la variable passée à la fonction.
  • Utilisez __init__ pour créer une variable d'instance : Créez une variable d'instance dans le constructeur de la classe (__init__). La variable d'instance est alors accessible dans la compréhension de liste.

Exemple

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)]
Copier après la connexion

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)
Copier après la connexion

Utilisation de __init__ pour créer une variable d'instance :

def __init__(self):
    self.y = [self.x for i in range(1)]
Copier après la connexion

Autres considérations

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal