Reprenant les conseils de Mike et Alex et ajoutant ma propre couleur ...
L'utilisation d'attributs d'instance est typique ... le Python le plus idiomatique. Les attributs de classe ne sont pas utilisés autant, car leurs cas d'utilisation sont spécifiques. Il en va de même pour les méthodes statiques et de classe par rapport aux méthodes «normales». Ce sont des constructions spéciales traitant des cas d'utilisation spécifiques, sinon c'est du code créé par un programmeur aberrant qui veut montrer qu'il connaît un coin obscur de la programmation Python.
Alex mentionne dans sa réponse que l'accès sera (un peu) plus rapide en raison d'un niveau de recherche en moins ... laissez-moi clarifier davantage pour ceux qui ne savent pas encore comment cela fonctionne. Il est très similaire à l'accès aux variables - dont l'ordre de recherche est:
- des locaux
- non locaux
- globaux
- intégrés
Pour l'accès aux attributs, l'ordre est:
- exemple
- classe
- classes de base telles que déterminées par le MRO (ordre de résolution des méthodes)
Les deux techniques fonctionnent de manière «à l'envers», ce qui signifie que les objets les plus locaux sont vérifiés en premier, puis les couches externes sont vérifiées successivement.
Dans votre exemple ci-dessus, disons que vous recherchez l' path
attribut. Lorsqu'il rencontre une référence telle que " self.path
", Python examinera d'abord les attributs de l'instance pour une correspondance. Lorsque cela échoue, il vérifie la classe à partir de laquelle l'objet a été instancié. Enfin, il recherchera les classes de base. Comme Alex l'a déclaré, si votre attribut est trouvé dans l'instance, il n'a pas besoin de chercher ailleurs, d'où votre petit gain de temps.
Cependant, si vous insistez sur les attributs de classe, vous avez besoin de cette recherche supplémentaire. Ou , votre autre alternative est de faire référence à l'objet via la classe au lieu de l'instance, par exemple MyController.path
au lieu de self.path
. C'est une recherche directe qui contournera la recherche différée, mais comme Alex le mentionne ci-dessous, c'est une variable globale, donc vous perdez ce bit que vous pensiez que vous alliez enregistrer (à moins que vous ne créiez une référence locale au nom de la classe [global] ).
L'essentiel est que vous devez utiliser les attributs d'instance la plupart du temps. Cependant, il y aura des occasions où un attribut de classe est le bon outil pour le travail. Le code utilisant les deux en même temps nécessitera le plus de diligence, car l'utilisation self
ne vous donnera que l'objet d'attribut d'instance et l' accès des ombres à l'attribut de classe du même nom. Dans ce cas, vous devez utiliser l'accès à l'attribut par le nom de classe afin de le référencer.