次のことを行うクラスデコレータを作成する最良の方法を見つけようとしています:
- 装飾されたクラスにいくつかの関数を挿入します
- 装飾されたクラス
__init__
が呼び出された後に、これらの関数のいずれかを強制的に呼び出します
現在、「元の」メソッドへの参照を保存して、元のメソッドと追加の関数を呼び出す__init__
my に置き換えています。__init__
これは次のようになります。
orig_init = cls.__init__
def new_init(self, *args, **kwargs):
"""
'Extend' wrapped class' __init__ so we can attach to all signals
automatically
"""
orig_init(self, *args, **kwargs)
self._debugSignals()
cls.__init__ = new_init
__init__
オリジナルを「増強」するか、別の場所に呼び出しを挿入するより良い方法はありますか? 本当に必要なのはself._debugSignals()
、オブジェクトが作成された後に my が呼び出されることだけです。また、それが自動的に行われるようにしたいので、アフター__init__
が良い場所だと思いました。
余分な雑用。デコレータノート
このデコレーターの背景について言及する価値があるかもしれません。完全なコードはここにあります。デコレーターのポイントは、PyQt シグナルに自動的にアタッチし、それらが発行されたときに出力することです。の独自のサブクラスをデコレートすると、デコレータは正常に動作QtCore.QObject
しますが、最近、すべての QObject の子を自動的にデコレートしようとしています。
アプリケーションで「デバッグ」モードを使用して、すべての信号を自動的に出力して、期待どおりに動作していることを確認したいと思います。これにより大量のデバッグが発生すると確信していますが、何が起こっているのかを確認したいと思います。
問題は、私の現在のバージョンのデコレーターが、置き換え時にセグメンテーション違反QtCore.QObject.__init__
を引き起こしていることです。これをデバッグしようとしましたが、コードはすべて SIP で生成されたものであり、あまり経験がありません。
__init__
そのため、関数呼び出しの後に関数呼び出しを挿入し、できればセグメンテーション違反を回避するための、より安全でより Pythonic な方法があるかどうか疑問に思っていました。