2016-11-28 3 views
0

У меня есть словарь имен атрибутов и функций, используемых для форматирования соответствующих значений при создании объекта:Можно ли назначить функцию 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-декатора?

+2

[Это] (http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html) может быть некоторое отношение к вы. –

+1

Почему вы * хотите * сделать это без 'property'? Вы вообще не хотите использовать дескрипторы? – jonrsharpe

+0

@jonrsharpe У меня есть аналогичные классы с различными функциями форматирования, это просто упрощение, чтобы проиллюстрировать проблему. Я использую '@ property', но это создаст много избыточного кода; также я хочу, чтобы класс был очень скудным и гибким, так что новые атрибуты и функции форматирования могут быть легко добавлены без значительного изменения кода. – Kaleidophon

ответ

0

Благодаря @EliSadoff и @Jonrsharpe! Я просто реализовал решение перезаписана setattr:

def __setattr__(self, name, value): 
    if hasattr(self, "formatting_functions"): 
     if name in self.formatting_functions: 
      formatting_function = self.formatting_functions[name] 
      value = formatting_function(value) 
    super(CoolClass, self).__setattr__(name, value) 
Смежные вопросы