Pythonの:複数のプロパティ、1つのセッター/ゲッター
-
22-09-2019 - |
質問
以下のクラスを考えてみ定義
class of2010(object):
def __init__(self):
self._a = 1
self._b = 2
self._c = 3
def set_a(self,value):
print('setting a...')
self._a = value
def set_b(self,value):
print('setting b...')
self._b = value
def set_c(self,value):
print('setting c...')
self._c = value
a = property(fset=self.set_a)
b = property(fset=self.set_b)
c = property(fset=self.set_c)
set_[a|b|c]()
が同じことを行うことに注意してください。定義するやり方があります:
def set_magic(self,value):
print('setting <???>...')
self._??? = value
一度
を次のようにA、B、Cのためにそれを使用a = property(fset=self.set_magic)
b = property(fset=self.set_magic)
c = property(fset=self.set_magic)
解決
def attrsetter(attr):
def set_any(self, value):
setattr(self, attr, value)
return set_any
a = property(fset=attrsetter('_a'))
b = property(fset=attrsetter('_b'))
c = property(fset=attrsetter('_c'))
他のヒント
私はあなたのセッターだけでメッセージをログに記録して、単純に値を割り当てることがわかります。それはおそらく、名前が「J」で始まる1いくつかの他の言語での慣例/従来の知恵であるので、あなたは、このパターンを使用していますか?
:もしそうなら、これと同じデザインにPython的アプローチがはるかに簡単であることを知ってくださいclass Of2010(object):
def __init__(self):
self.a = 1
self.b = 2
self.c = 3
はありません何もしないセッターは、中間の関数呼び出しは、単に値を代入しないように。 "あなたが言うこと? 「メンバ変数への公衆曝露?!!」さて、のはいの実際ます。
クライアントコードの観点から、これらのクラスを見てください。あなたのクラスを使用するには、クライアントがオブジェクトを作成し、[割り当て財産「」使用します:
obj = Of2010()
obj.a = 42
驚くべきことに、これは私が上記投稿5ライナークラスの正確な同じコードである。
なぜJ-言語は、より詳細なプロパティのスタイルを奨励していますか?要件の今後の変化のイベントにクラスインターフェイスを維持するために。ある時点で、オブジェクトのいくつかの他の値が変更と協調して変更する必要がある場合は、プロパティのメカニズムを実装する必要があります。それが将来のある時点でプロパティを導入するので、悲しいことに、J-言語は、クライアントコードへの属性アクセス機構の性質を公開すると、すべてのクライアントの再構築が必要になります押し付けがましいリファクタリングタスクであることを、そのクラスのメイク使用そしてその "" 属性ます。
はPythonでは、このようなケースではありません。オブジェクトの「」属性にアクセスするには、呼び出し側で実行時に決定されます。直接アクセスおよびプロパティへのアクセスの両方の「見た目」と同じので、あなたのPythonのクラスは、実際のメカニズムが異なっていても、このインタフェースを保持します。重要なのは、クライアントコード限りが懸念しているとして、それが同一であるということです。
だから、Javaで、このクラスの開始から1紹介このプロパティの複雑権(および実際には、慣例によって、ののすべてののクラス)、オフのチャンスにそれが必要になること将来のある日。パイソンを使用すると、1はおそらく、単純なメンバ変数に直接アクセスでの作業は、余分なものが実際に必要とされることが、将来的に時間のために複雑なアプローチを残すと値からできることが最も簡単な方法を実装することで起動することができます。その日は、実際に来ないかもしれないので、これは巨大なジャンプはドアの外にあなたのコードの最初の作業バージョンを取得して前方にある。
class...
def __setattr__(self, name, value):
print 'setting', name
self.__dict__[name] = value
これだけです。
あなたが探しているかもしれませ
__setattr__(self, name, value)
を見てみましょうここを