2010-06-11 5 views
2

Ce que j'ai ci-dessous est une classe que j'ai faite pour stocker facilement un tas de données en tant qu'attributs. Ils finissent par être stockés dans un dictionnaire. Je remplace __getattr__ et __setattr__ pour stocker et récupérer les valeurs dans différents types d'unités. Quand j'ai commencé __setattr__ remplaçant j'avais du mal à créer que dicionary initiale dans la 2ème ligne de __init__ comme si ...créer un attribut de classe sans passer par __setattr__

super(MyDataFile, self).__setattr__('_data', {})

Ma question ... est-il un moyen plus facile de créer un attribut de niveau de classe avec passer par __setattr__? De même, devrais-je me préoccuper de conserver un dictionnaire séparé ou devrais-je simplement tout stocker au self.__dict__?

#!/usr/bin/env python 

from unitconverter import convert 
import re 

special_attribute_re = re.compile(r'(.+)__(.+)') 

class MyDataFile(object): 

    def __init__(self, *args, **kwargs): 
     super(MyDataFile, self).__init__(*args, **kwargs) 
     super(MyDataFile, self).__setattr__('_data', {}) 

    # 
    # For attribute type access 
    # 
    def __setattr__(self, name, value): 
     self._data[name] = value 

    def __getattr__(self, name): 

     if name in self._data: 
      return self._data[name] 

     match = special_attribute_re.match(name) 
     if match: 
      varname, units = match.groups() 
      if varname in self._data: 
       return self.getvaras(varname, units) 

     raise AttributeError 

    # 
    # other methods 
    # 
    def getvaras(self, name, units): 
     from_val, from_units = self._data[name] 
     if from_units == units: 
      return from_val 
     return convert(from_val, from_units, units), units 

    def __str__(self): 
     return str(self._data) 



d = MyDataFile() 

print d 

# set like a dictionary or an attribute 
d.XYZ = 12.34, 'in' 
d.ABC = 76.54, 'ft' 

# get it back like a dictionary or an attribute 
print d.XYZ 
print d.ABC 

# get conversions using getvaras or using a specially formed attribute 
print d.getvaras('ABC', 'cm') 
print d.XYZ__mm 
+1

L'avez-vous essayé sans '__setattr__'? Si oui, qu'avez-vous observé? Cela devrait fonctionner correctement. –

+0

J'ai besoin de __setattr__ parce que je veux définir les variables avec des unités de la même manière que je les récupère. Je n'avais tout simplement pas cela dans la copie que j'ai collée. Par exemple 'd.XYZ = 12.34, 'in'' ou' d.XYZ__in = 12.34' –

+0

Votre '__setattr__' dans l'exemple ne fait * rien *. Retirez-le. Essayez sans ça. Voyez ce qui se passe. Conservez votre valeur et vos unités sous la forme d'un simple 2-uplet. Puisque le '__setattr__' que vous avez fourni * est * l'implémentation par défaut, vous pouvez le supprimer. –

Répondre

0

Votre __setattr__ dans l'exemple ne faire quoi que ce soit, sauf mettre les choses en _data au lieu de __dict__ Retirez.

Modifiez votre __getattr__ pour utiliser __dict__.

Stockez votre valeur et vos unités sous la forme d'un simple 2-uplet.

Questions connexes