9
votes

Y a-t-il des "gotchas" avec ce modèle Python?

Voici le motif que je pense utiliser:

class Dicty(dict): 
    def __init__(self): 
         self.__dict__ = self 

d = Dicty()
d.foo = 'bar' 
print d['foo']
>>> bar 
d['foo'] = 'baz'
print d.foo
>>> 'baz'


3 Réponses :


3
votes

Ne définissez pas auto .__ dict __ . Call __ init __ (auto, * args, ** kwargs) sur la superclasse. En outre, dict hérite de objet de sorte que vous n'avez pas besoin de la spécifier.


0 commentaires

10
votes

Voici un moyen moins "hacky" d'atteindre le même effet: xxx

i pense que votre chemin peut bien fonctionner aussi bien, mais en définissant le __ dict __ Attribut comme celui-ci semble un peu sage de style IFFY et est tenu de poser quelques questions si quelqu'un d'autre finit par lire votre code.


7 commentaires

Vous devriez attraper et traduire keillerror - __ getattr __ est censé lancer attributeError .


Si vous allez faire cela, il vaut mieux faire __ getattr__ = __getem __ et __ setattr__ = __setem __ . Plus simple, et un appel moins de fonction.


@Kindall @pioTrlegnica: Vous faites tous deux d'excellents points (bien que mutuellement exclusives)! Merci! :)


@kindall, c'est une idée géniale!


@Gearoidmurphy. Je suis intéressé par des conteneurs de données de chargement prenant en charge la syntaxe conteneur.Attribute . Y a-t-il une raison pour laquelle ces objets ne peuvent pas être marinés? Avez-vous des suggestions pour une solution alternative qui prend en charge le décapage?


Utilisez l'approche qui décrit «Sudacy» dans sa question, cela fonctionne bien


ne semble pas fonctionner pour un objet imbriqué. Et si la clé de la dicte a des espaces ..