Les pseudo-dicts que les propriétés
-
01-10-2019 - |
Question
J'ai un C
de classe Python qui devrait avoir deux pseudo-dict
s a
et b
. Le terme pseudo-Dicts signifie que les dictionnaires n'existent pas réellement et qu'ils sont « recalculées » chaque fois qu'une touche est accessible.
Dans ce pseudocode ressemblerait à ceci:
class C:
def a.__getitem__(self, key):
return 'a'
def b.__getitem__(self, key):
return 'b'
>>> c = C()
>>> c.a['foo']
'a'
>>> c.b['bar']
'b'
Je pourrais mettre en œuvre une classe pour a
et b
, mais puisque les deux ont quelques méthodes courtes, je me demande s'il y a un moyen de faire plus élégant et compact cela.
La solution
Pourquoi ne pas simplement définir votre propre classe?
class PseudoDict(object):
def __init__(self, c):
self.c = c
def __getitem__(self, key):
return self.c.somethingmagical()
class C(object):
def __init__(self):
self.a = PseudoDict(self)
self.b = PseudoDict(self)
c = C()
print c.a['foo']
print c.b['bar']
Je ne sais pas où les valeurs de ces proviennent de « pseudo-dicts », de sorte que vous devrez mettre à jour la méthode __getitem__
.
Autres conseils
Comme cela?
from collections import defaultdict
class C:
a = defaultdict(lambda:'a')
b = defaultdict(lambda:'b')
c=C()
print c.a['foo']
print c.b['bar']
Ou peut-être comme celui-ci pour les fonctions de calcul réel?
from collections import defaultdict
class C:
def __init__(self):
self.a = defaultdict(self.geta)
self.b = defaultdict(self.getb)
def geta(self):
return 'a'
def getb(self):
return 'b'
c=C()
print c.a['foo']
print c.b['bar']