2016-11-28 1 views
0

나는 객체가 생성 될 때 해당 값을 포맷하기 위해서 사용되는 속성 이름과 기능의 사전을 가지고 :@ x.setter 데코레이터가없는 객체 속성에 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 후, 해당 포맷 함수처럼 속성 (물론) 실행되지 않습니다. 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

덕분에 @ 엘리자독과 @ 존 러샤프!

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) 
관련 문제