簡體   English   中英

動態添加裝飾器到類

[英]Dynamically add a decorator to class

我有一個相當大的涉及裝飾器來調試我想動態添加到類的PyQt信號 有沒有辦法動態地向類中添加裝飾器?

我可能會從錯誤的角度處理這個問題,所以這就是我想要完成的。

目標

  1. 我有一個裝飾器,它將發現/附加到類中的所有pyqt信號,並在發出這些信號時打印調試。
  2. 這個裝飾器非常適合調試單個類的信號。 但是,可能有一段時間我想在應用程序中附加所有信號。 這可以用來看我是否在意外時間發出信號等。
  3. 我想動態地將這個裝飾器連接到我的所有有信號的類。

可能的解決方案/想法

到目前為止,我已經考慮了幾種可能的解決方案:

  1. 繼承:如果我的所有類都具有相同的基類(除了Python的內置object和PyQt的內置QtCore.QObject ),這將很容易。 我想我可以將這個裝飾器附加到我的基類,一切都會按預期運行。 但是,在這個特定的應用中並非如此。 我不想將所有類更改為具有相同的基類。
  2. 猴子補丁Python objectQtCore.QObject :我不知道這將如何實際工作。 但是,從理論上講,我可以將其中一個基類' __init__更改為我在裝飾器中定義的new_init嗎? 這看起來真的很危險,但也許這是一個方法?
  3. 元類:我不認為元類在這種情況下會起作用,因為我必須動態地將__metaclass__屬性添加到我想要將裝飾器注入的類中。 我認為這是不可能的,因為要插入此屬性,必須已經構造了類。 因此,我定義的任何元類都不會被調用。 這是真的?

我嘗試了一些元類魔法的變種,但似乎沒有任何效果。 我覺得使用元類可能是實現我想要的方式,但我似乎無法讓它工作。

再說一遍,我可能會把這一切都搞錯了。 基本上我想將上面引用的裝飾器中的行為附加到我的應用程序中的所有類(甚至可能是選擇類的列表)。 另外,如果有必要,我可以重構我的裝飾師。 如果我用裝飾器或其他機制附加此行為,我真的不在乎。 我只是假設這個裝飾器已經完成了我想要的單個類,所以可能很容易擴展。

裝飾器只不過是自動應用的callable。 要手動應用它,請使用裝飾器的返回值替換該類:

import somemodule

somemodule.someclass = debug_signals(somemodule.someclass)

這取代了somemodule.someclass名字與返回值debug_signals ,這是我們通過原somemodule.someclass類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM