C'est un autre cas des pylint
règles aveugles de 's.
«Les classes ne sont pas destinées à stocker des données» - c'est une fausse déclaration. Les dictionnaires ne sont pas bons pour tout. Un membre de données d'une classe est quelque chose de significatif, un élément de dictionnaire est quelque chose de facultatif. Preuve: on peut faire dictionary.get('key', DEFAULT_VALUE)
pour empêcher un KeyError
, mais il n'y a pas de simple __getattr__
avec le défaut.
EDIT - méthodes recommandées pour utiliser les structures
J'ai besoin de mettre à jour ma réponse. En ce moment - si vous en avez besoin struct
, vous avez deux bonnes options:
a) Il suffit d'utiliser attrs
Voici une bibliothèque pour cela:
https://www.attrs.org/en/stable/
import attr
@attr.s
class MyClass(object): # or just MyClass: for Python 3
foo = attr.ib()
bar = attr.ib()
Ce que vous obtenez en plus: ne pas écrire de constructeurs, valeurs par défaut, validation, __repr__
objets en lecture seule (à remplacer namedtuples
, même en Python 2) et plus encore.
b) Utiliser dataclasses
(Py 3.7+)
Suite au commentaire de hwjp, je recommande également dataclasses
:
https://docs.python.org/3/library/dataclasses.html
C'est presque aussi bon que attrs
, et c'est un mécanisme de bibliothèque standard ("piles incluses"), sans dépendances supplémentaires, sauf Python 3.7+.
Reste de la réponse précédente
NamedTuple
n'est pas génial - surtout avant python 3 typing.NamedTuple
:
https://docs.python.org/3/library/typing.html#typing.NamedTuple
- vous devriez certainement vérifier le NamedTuple
modèle "classe dérivée de ". Python 2 - namedtuples
créé à partir de descriptions de chaînes - est moche, mauvais et "programmer dans des chaînes littérales" stupide.
Je suis d'accord avec les deux réponses actuelles ("envisager d'utiliser autre chose, mais pylint n'est pas toujours correct" - la réponse acceptée, et "utiliser le commentaire de suppression de pylint"), mais j'ai ma propre suggestion.
Permettez-moi de le souligner une fois de plus: certaines classes sont destinées uniquement à stocker des données.
Maintenant, l'option à considérer également - utilisez property
-ies.
class MyClass(object):
def __init__(self, foo, bar):
self._foo = foo
self._bar = bar
@property
def foo(self):
return self._foo
@property
def bar(self):
return self._bar
Ci-dessus, vous avez des propriétés en lecture seule, ce qui est OK pour Value Object (par exemple, comme celles de Domain Driven Design), mais vous pouvez également fournir des setters - de cette façon, votre classe sera en mesure d'assumer la responsabilité des champs que vous avez - par exemple pour faire des validations etc. (si vous avez des setters, vous pouvez les assigner en les utilisant dans le constructeur, c'est-à-dire self.foo = foo
au lieu de direct self._foo = foo
, mais attention, les setters peuvent supposer que d'autres champs sont déjà initialisés, et alors vous avez besoin d'une validation personnalisée dans le constructeur) .