2012-02-23 3 views
0

I 클래스 데코레이터를 사용하고 있지만 내가 않은 setattr와 방법 설정 속성을 이해하지 못했지만,이 내 코드입니다 :__setattr__ 클래스 장식 파이썬

def cldecor(*par): 
    def onDecorator(aClass): 
     class wrapper: 
      def __init__(self, *args): 
       self.wrapped = aClass(*args) 
      def __getattr__(self, name): 
       return getattr(self.wrapped, name) 
      def __setattr__(self, attribute, value): 
       if attribute == 'wrapped': 
        self.__dict__[attribute] = value 
       else: 
        setattr(self.wrapped, attribute, value) 
     return wrapper 
    return onDecorator 


@cldecor('data','size') 
class Doubler: 
    def __init__(self,label,start): 
     self.label = label 
     self.data = start 

    def display(self): 
     print('{0} => {1}'.format(self.label, self.data)) 

하지만 난 수행 할 때

if __name__ == "__main__": 
    X = Doubler('X is ', [1,2,3]) 
    X.xxx = [3,4,9] 
    print(X.xxx) 
    X.display() 

내가이 출력이 있습니다

[3, 4, 9] 
X is => [1, 2, 3] 

내가 어떻게이 출력있는을 위해 할 수 있습니까?

[3, 4, 9] 
X is => [3, 4, 9] 
+3

아마도 이것이 달성하기로되어 있다고 생각하는 것을 설명해주십시오. – Marcin

+3

코드에서'* par'은 무엇을합니까? 당신은 그것을 사용하지 않은 상태로 두십시오 ... – glglgl

+0

게시 된 코드는 귀하가 보여준 결과물을 생성하지 않습니다. 출력은''[3, 4, 9]입니다. \ X는 => [1, 2, 3]입니다. '' – AdamKG

답변

2

귀하의 display 메소드는 self.data의 데이터를 인쇄,하지만 당신은 속성이 xxx을 caled 만들었습니다. 물론 display은 표시하지 않습니다. 작동 방식 :

>>> X.data = [3,4,9] 
>>> X.display() 
X is => [3, 4, 9] 
관련 문제