Initialisation de membres statique
Bonjour,
je cherche à initialiser un membre statique en fonction d'autres membres statiques définis juste avant, mais je ne trouve pas de solution satisfaisante...
Voici un bout de code pour comprendre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| # met a plat un dictionnaire en ne gardant que les elements dont les clefs commencent par <pattern>
def flat_dict ( dic,pattern ):
return sum((( value,name ) for name,value in dic.items() if name.startswith( pattern )),())
class Spam :
# mes valeurs d'enum auxquelles je veux pouvoir acceder par le nom
enum1,enum2,enum3 = xrange( 3 )
# liste associative des paires valeur,nom
names1 = []
names2 = flat_dict( self.__class__.__dict__,'enum' )
names3 = flat_dict( Spam.__class__.__dict__,'enum' )
names4 = flat_dict( Spam.__dict__,'enum' )
def _build_names (self):
self.names1 = flat_dict( self.__class__.__dict__,'enum' )
def get_value (self,enum_name):
return self.names1[ self.names1.index( enum_name )-1 ]
def __init__(self):
self._build_names()
s = Spam()
print s.names1 # (0, 'enum1', 1, 'enum2', 2, 'enum3')
print s.get_value( 'enum2' ) # 1 |
J'ai testé 4 possibilités :
names1 : ça marche mais j'ai une initialisation non statique (pas ce que je veux)
names2 : ne compile pas : "NameError: name 'self' is not defined" (ça me paraît logique : pas de self en static)
names3 : ne compile pas : "name 'Spam' is not defined"
names4 : idem names3 (c'est pourtant la version qui me paraissait la plus plausible...)
--> j'en conclus que tant que le compilateur n'a pas atteint la fin de la déclaration de la classe Spam, cette dernière n'est pas accessible, et que du coup, il n'y a pas de solution à mon problème... :cry:
Si quelqu'un a une idée...
Merci d'avance !