クラス変数を受け入れることができるクラスでデコレータをセットアップする方法が不思議です。これが役に立つと思う例はPyside/PyQtです。関数の始めと終わりにウィジェットのシグナルをブロックしてブロックを解除する必要があります。クラス変数を渡している間にクラスオブジェクト内の装飾子
例:
class Window(QtGui.QMainWindow):
....
def updateList(self, *args):
self.list.blockSignals(False)
//do things on self.list
self.list.blockSignals(True)
は今、これを行うことができるさまざまなウィジェット上の場所がたくさんの可能性があります。もちろん、私はこの方法で各項目をブロックしたり解除したりすることができますが、それは面倒です。そして、私が済んだら、すべてをブロック解除することを忘れないでください。
別の手順に移動すると、ブロックを自分の機能に移動できます。
class Window(QtGui.QMainWindow):
....
def updateList(self, *args):
self.block([self.list])
//do things on self.list
self.block([self.list])
def block(self, items):
for item in items:
if item.signalsBlocked():
item.blockSignals(False)
else:
item.blockSignals(True)
甘い!私は自分のコードの周りにそれをかけることができ、かなり役に立つと感じています。しかし、私はそれが本当に世界的に有用なものにするためにここで欠けているいくつかの種類の最終的なボスフォームがあるように感じる。デコレータのようなもの。
ここで私のデコレータに変数を渡して、私の関数を飾ることができます! Decorators with parameters?
def block(items):
def dec(fn):
def wrapped(*args, **kwargs):
for item in items:
item.blockSignals(True)
fn(*args, **kwargs)
for item in items:
item.blockSignals(False)
return wrapped
return dec
class Window(QtGui.QMainWindow):
....
@block([self.list])
def updateList(self, *args):
//do things on self.list
今、私はそれが本当に有用である可能性を感じます! @block([self.list])は自己が何であるか分かりません。
私がしようとしていることは、これを行うことができると想定するのは妥当ですか?それは可能ですか、野生の竜を追いかけていますか?可能であれば、これを試みる正しい方法は何ですか?
@DavisHerringああはい、私はもう一度別の答えを見て、私はそれを修正しました。 – ooklah
(コメントのクリーンアップ) –
これはデコレータではなくコンテキストマネージャでなければなりません。どのような特定のオブジェクトや関数/メソッドにも結びついていないので、それはもっと柔軟になります。 – ekhumoro