создать атрибут класса без прохождения __setattr__ - PullRequest
2 голосов
/ 11 июня 2010

Ниже приведен класс, который я создал для простого хранения группы данных в качестве атрибутов.Они запоминаются в словаре.Я переопределяю __getattr__ и __setattr__, чтобы хранить и получать значения обратно в различных типах единиц.Когда я начал переопределять __setattr__, у меня возникли проблемы с созданием этого начального дичионара во 2-й строке __init__ примерно так ...

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

Мой вопрос ... Есть ли более простой способ создать атрибут уровня класса, пройдя через __setattr__?Кроме того, я должен заботиться о сохранении отдельного словаря или я должен просто хранить все в 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 Ответ

0 голосов
/ 12 июня 2010

Ваш __setattr__ в этом примере не делает ничего, кроме как помещает вещи в _data вместо __dict__ Удалите его.

Измените __getattr__ на __dict__.

Сохраните ваши значения и единицы в виде простого 2-х кортежа.

...