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
L'avez-vous essayé sans '__setattr__'? Si oui, qu'avez-vous observé? Cela devrait fonctionner correctement. –
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' –
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. –