2016-11-28 7 views
0

私はオブジェクトが作成されたときに対応する値をフォーマットするために使用される属性名と機能の辞書持っている:私はこれらの「特別な」後でdateまたはpriceなどの属性、対応する書式設定機能を設定するかどう@ 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]) 

をしかし、 (もちろん)実行されません。 dateprice@propertyデコレータに、str_to_date()/str_to_price()をそれぞれ@date.setter -/@price.setterデコレータに明示的に書き込むことなく、これを行うことはできますか?

+2

[この](http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html)いくつかの関連性があるかもしれませんへ:私はちょうどsetattrを上書きするソリューションを実装しました君は。 –

+1

なぜ「プロパティ」なしでこれをしたいですか?記述子をまったく使用したくないですか? – jonrsharpe

+0

@jonrsharpe私は異なる/より多くの書式設定関数を持つ類似のクラスを持っていますが、これは単に問題を説明するための単純化です。私は '@ property'を使うことができましたが、多くの冗長コードが生成されていました。また、非常にリーンでフレキシブルなクラスにしたいので、コードをあまり変更しなくても新しい属性や書式設定関数を簡単に追加できます。 – Kaleidophon

答えて

0

@EliSadoffと@Jonrsharpeに感謝します!

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) 
関連する問題