2016-12-09 3 views
0

に属性は、私たちが10個の属性を持っていると言う:Pythonの:すべてのインスタンスを変更するプロパティ

class test(object): 
    def __init__(self,a,b,c,d,e,f,g,h,i,j): 
    self._a = a 
    #the same with the rest of variables 

は彼らにすべてのプロパティを作成することが可能です?:

@property 
def a(self): 
    return self.a 
@a.setter 
def a(self,a_new): 
    #invoke other functions doing other stuff when attribute values change 
    self._a = a_new 

私がしたときに実行するために同じ機能を必要とする場合インスタンスの属性が変更された場合、各属性に対して上記のコードを入力する必要がありますか?一度コードを書いてから、それをカスタムデコレータなどに使うことは可能ですか?

カスタムデコレータを使用する方法がある場合は、あとでいくつかの属性のセッター機能をオーバーライドできますか?

答えて

1

実際にの場合、すべてのインスタンス属性をプロパティにするには、__setattr____getattribute__メソッドを実装できます。ここでは、短いデモです:

super(Test, self) 

例:

class Test(object): 
    attr_names = {'a', 'b', 'c', 'd'} 

    def __init__(self, a, b, c, d): 
     self.a = a 
     self.b = b 
     self.c = c 
     self.d = d 

    def __repr__(self): 
     return 'Test({}, {}, {}, {})'.format(self.a, self.b, self.c, self.d) 

    def __setattr__(self, name, value): 
     if name in Test.attr_names: 
      print('Setting {} to {}'.format(name, value)) 
      super().__setattr__(name, value) 
     else: 
      raise AttributeError("Can't set unknown attribute: " + name) 

    def __getattribute__(self, name): 
     if name in Test.attr_names: 
      print('Getting {}'.format(name)) 
      return super().__getattribute__(name) 
     else: 
      raise AttributeError("Can't get unknown attribute: " + name) 

t = Test(1, 2, 3, 4) 
print(t) 
t.b = 7 
print(t) 

try: 
    t.e = 42 
except AttributeError as err: 
    print(err) 

出力このコードは、あなたがsuperに適切な引数を渡す必要がありますのPython 2ではPythonの3のためにある

Setting a to 1 
Setting b to 2 
Setting c to 3 
Setting d to 4 
Getting a 
Getting b 
Getting c 
Getting d 
Test(1, 2, 3, 4) 
Setting b to 7 
Getting a 
Getting b 
Getting c 
Getting d 
Test(1, 7, 3, 4) 
Can't set unknown attribute: e 

super(Test, self).__setattr__(name, value) 

これらの方法の詳細については、data model docsを参照してください。

関連する問題