136 votes

Variables d'instance et variables de classe en Python

J'ai des classes Python, pour lesquelles je n'ai besoin que d'une instance au moment de l'exécution, il serait donc suffisant d'avoir les attributs une seule fois par classe et non par instance. S'il y a plus d'une instance (ce qui ne se passera pas), toutes les instances doivent avoir la même configuration. Je me demande laquelle des options suivantes serait meilleure ou plus "idiomatique" en Python.

Variables de classe:

 MyController(Controller):

  path = "something/"
  children = [AController, BController]

  def action(request):
    pass
 

Variables d'instance:

 MyController(Controller):

  def __init__(self):
    self.path = "something/"
    self.children = [AController, BController]

  def action(self, request):
    pass
 

172voto

Alex Martelli Points 330805

De toute façon, si vous n’avez qu’une seule instance, il est préférable de créer toutes les variables par instance, tout simplement parce qu’elles seront consultées (un peu) plus rapidement (un niveau de "recherche" de moins en raison de "l’héritage" de la classe à l’instance), et il n'y a aucun inconvénient à peser contre ce petit avantage.

47voto

wescpy Points 2127

en outre écho à mike et alex, les conseils et l'ajout de ma propre couleur...

à l'aide de l'instance attributs typiques, plus idiomatiques Python. les attributs de classe ne sont pas souvent utilisés, du moins pas dans le code de production dans mon dernier de+ de 13 années consécutives de Python. la même chose est vraie pour la statique et les méthodes de la classe... juste pas très commun, sauf si il y a un cas d'utilisation spécifiques ou une aberrante programmeur désireux de montrer qu'ils savent quelque coin obscur de programmation Python.

alex mentionne dans sa réponse que l'accès sera (un peu) plus rapide en raison d'un moindre niveau de la recherche... permettez-moi de clarifier davantage pour ceux qui ne savent pas comment cela fonctionne encore, il est très similaire à la variable d'accès -- la recherche se passe dans cet ordre:

  1. les habitants
  2. les communautés non locales
  3. globals
  4. built-ins

pour l'attribut d'accès, la commande est:

  1. exemple
  2. classe
  3. les classes de base tel que déterminé par le MRO (méthode de résolution de l'ordre)

dans l'exemple ci-dessus, disons que vous êtes à la recherche de l' path d'attribut. quand il rencontre une référence comme "self.path", Python va regarder l'exemple des attributs première pour un match; quand cela échoue, il vérifie la classe dont l'objet est instancié à partir d'. enfin, il recherche les classes de base. comme alex l'a dit, si votre attribut est trouvé dans l'instance, il ne sera pas reporter à la classe, par conséquent, votre peu de gain de temps.

toutefois, si vous insistez sur les attributs de classe, vous aurez à renoncer à ce petit peu de performance, ouvotre autre alternative est de se référer à l'objet via la classe à la place de l'instance, par exemple, MyController.path au lieu de self.path. c'est une recherche qui permettra de contourner le report de la recherche, mais comme alex mentionne ci-dessous, qui est une variable globale, alors vous perdez le peu que vous pensiez que vous alliez à enregistrer (sauf si vous créez une référence locale à la [global] du nom de la classe).

28voto

Mike Graham Points 22480

En cas de doute, vous voudrez probablement une instance de l'attribut.

Les attributs de classe sont préférable de réserver pour les cas spéciaux où ils font sens. Le seul très-communs cas d'utilisation de méthodes. Il n'est pas rare d'utiliser les attributs de classe pour lire uniquement les constantes que les instances besoin de savoir (même si le seul avantage de ceci est que si vous aussi vous souhaitez accéder à partir de l'extérieur de la classe), mais vous devez certainement être prudent sur l'entreposage de tout état, ce qui est rarement ce que vous voulez. Même si vous n'avez qu'un seul exemple, vous devez écrire la classe comme vous le feriez pour tout autre, ce qui signifie généralement l'aide d'attributs d'instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X