2012-02-23 10 views
0

私はクラスのデコレータを使用していますが、私はSETATTRとどのように設定された属性を理解していなかったが、これは私のコードです:__setattr__クラスのデコレータのpython

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] \ n Xは=> [1、2、3] 'です。 – AdamKG

答えて

2

あなたdisplay方法が唯一self.data内のデータを印刷していますが、xxxをcaled属性を作成しました。もちろんdisplayには表示されません。これはうまくいきます:

>>> X.data = [3,4,9] 
>>> X.display() 
X is => [3, 4, 9] 
関連する問題