Est-il un type de données en Python similaire pour les structures en C++?
Est-il un type de données en Python similaire pour les structures en C++? J'aime la structure de la fonction myStruct.someName
. Je sais que les classes ont cela, mais je ne veux pas écrire une classe à chaque fois que j'ai besoin d'un "conteneur" de certaines données.
Depuis en C++
Généralement, nous utilisons un dict, où la syntaxe est
K: Tu veux dire que je peux créer une instance
Oui.
Merci à tous pour les conseils!
struct
s et class
es sont la même chose (ils ne diffèrent que par la valeur par défaut des membres et de l'héritage spécificateurs d'accès), vous pouvez simplement écrire un class
...Généralement, nous utilisons un dict, où la syntaxe est
mydict["someName"]
. Mais si vous définissez votre propre classe une fois, vous pouvez ajouter n'importe quel attribut que vous souhaitez instances.K: Tu veux dire que je peux créer une instance
foo
d'une classe bar
et ajouter des attributs à cette dynamique? Comme première foo
il est vide, puis-je ajouter un attribut, puis un autre et ainsi de suite?Oui.
class Struct(object): pass
s = Struct()
s.a = 5
print(s.a)
imprime 5.Merci à tous pour les conseils!
OriginalL'auteur Aufwind | 2011-05-09
Vous devez vous connecter pour publier un commentaire.
Pourquoi pas? Les Classes sont très bien pour cela.
Si vous voulez économiser de la mémoire, vous pouvez également utiliser
__slots__
de sorte que les objets n'ont pas une__dict__
. Voir http://docs.python.org/reference/datamodel.html#slots pour plus de détails et L'utilisation de __slots__? pour quelques informations utiles.Par exemple, une classe possédant seulement deux valeurs (
a
etb
) pourrait ressemble à ceci:Si vous voulez vraiment un dict, mais avec
obj.item
l'accès au lieu deobj['item']
, vous pouvez sous-classe dict et de mettre en œuvre__getattr__
et__setattr__
à se comporter comme__getitem__
et__setitem__
.C'est sérieusement sous-estimé la réponse dans un sujet vague. Un dict avec
__getattr__
et__setattr__
fonctions me semble être une très élégante façon de mettre en œuvre struct type de comportement en python.OriginalL'auteur ThiefMaster
En plus de la dict type, il y a un namedtuple type qui se comporte un peu comme un struct.
Notez qu'un
namedtuple
est en lecture seule, c'est à dire vous ne pouvez pas modifier les valeurs commeaStruct.someName = "foo"
(bien sûr, cela est conforme à la normale tuples).OriginalL'auteur sock
Veuillez réaliser qu'en C++, la seule différence entre une classe et une struct est que les éléments d'une classe sont par défaut privé, comme c'est l'héritage. Les suivantes sont équivalentes:
En Python, il serait plus judicieux d'utiliser une classe si vous souhaitez utiliser l'opérateur point d'accéder à des éléments. En fait, il est encore plus facile, car vous ne devez initialiser les membres que vous désirez, et vous pouvez ajouter/supprimer des membres plus tard. Par conséquent, la suivante devrait fonctionner:
Vous pouvez ensuite ajouter autant de membres que vous souhaitez tout simplement en attribuant à eux.
Qui devrait être
class D(object): pass
.Des Classes sans méthodes (dump classes) sont considérés comme un anti-modèle, dans la mesure où je peux dire.
OriginalL'auteur Anton Golov
dataclass
est maintenant intégré à Python que de Python 3.7!Test:
De sortie:
D'ailleurs pour l'initialisation automatique et
__repr__
méthodes qu'il génère, il crée automatiquement un__eq__
méthode pour faire simple et intuitive pour comparer deux instances de la classe.Voir PEP 557.
Intégré à Python 3.6 à l'aide de la dataclasses paquet.
OriginalL'auteur ChaimG
Vous pouvez toujours aller pour l'approche dynamique:
Ce sera une classe avec les mêmes méthodes que vous transmettez en tant que dict:
vous laissant avec la suivante parfaitement valide appels sur
bar
:vous voyez l'idée...
OriginalL'auteur wheaties
Essayez d'utiliser un
dict
.Voici une démonstration simpliste.
OriginalL'auteur Johnsyweb
Je crois que vous êtes à la recherche d'un
dict
.OriginalL'auteur Demian Brecht
Ce peut-être l'idée un peu trop loin, mais ici, c'est un moyen de créer des "structures" à l'aide d'une syntaxe qui est un peu similaire à C++ structures qui effectue également des opérations de vérification de type. Tout d'abord, voici un exemple d'utilisation:
Et voici la mise en œuvre. C'est une variante de la
__slots__
idée de l'endroit où la classe avec des fentes (c'est à dire, le "struct" type) est généré dynamiquement. Cela pourrait bien sûr être interprétée de différentes manières, mais c'est juste une preuve de concept.OriginalL'auteur