У меня есть словарь имен атрибутов и функций, используемых для форматирования соответствующих значений при создании объекта:Можно ли назначить функцию setter атрибуту объекта без декоратора @ x.setter?
class CoolClass(object):
def __init__(self, **given):
self.formatting_functions.update({
"date": self.str_to_date,
"price": self.str_to_price
})
for attribute_name in given:
if attribute_name in self.formatting_functions:
formatting_function = self.formatting_functions[attribute_name]
setattr(
self, attribute_name,
formatting_function(given[attribute_name])
)
else:
setattr(self, attribute_name, given[attribute_name])
Но если я поставлю эти «специальные» атрибуты, как date
или price
позже, соответствующая функция форматирования (конечно) не будет выполнено. Могу ли я сделать это как-то без явного написания date
и price
с @property
-декаторами и str_to_date()
/str_to_price()
с соответствующими @date.setter
-/@price.setter
-декатора?
[Это] (http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html) может быть некоторое отношение к вы. –
Почему вы * хотите * сделать это без 'property'? Вы вообще не хотите использовать дескрипторы? – jonrsharpe
@jonrsharpe У меня есть аналогичные классы с различными функциями форматирования, это просто упрощение, чтобы проиллюстрировать проблему. Я использую '@ property', но это создаст много избыточного кода; также я хочу, чтобы класс был очень скудным и гибким, так что новые атрибуты и функции форматирования могут быть легко добавлены без значительного изменения кода. – Kaleidophon