」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Python 模組中模仿類別行為?

如何在 Python 模組中模仿類別行為?

發佈於2024-11-16
瀏覽:264

How Can You Mimic Class-Like Behavior in Python Modules?

使用getattr

在模組中動態實現類別行為在某些情況下,可能需要模仿_ _getattr__ 對類別的行為,但對整個模組的行為。這允許動態創建類別實例並根據模組上的屬性查找呼叫其方法。

但是,嘗試直接在模組上定義 __getattr__ 方法面臨兩個障礙:

  • Python 只檢查類別上的此類方法。
  • 修改底層模組類型(module)以允許屬性設定是不可行的。

基於包裝器的解決方案

一種方法是圍繞模組創建一個包裝器。 Sys.modules 能夠容忍不同的物件類型,因此我們可以將模組包裝在一個類別中並將其指派給 sys.modules[__name__]。這允許動態行為而無需修改模組本身。然而,這種技術僅適用於模組級存取。

Guido van Rossum's Hack

Guido van Rossum 建議的另一個解決方案涉及替換 sys.path 中的實際模組。具有模組內定義的類別實例的模組。導入機制執行最後的替換步驟,從而實現此駭客攻擊。以下範例示範了這種方法:

# module foo.py

import sys

class Foo:
    def funct1(self, *args):
        
    def funct2(self, *args):
        

sys.modules[__name__] = Foo()

現在,可以透過 Foo 的實例存取模組中定義的函數。

注意事項

使用這些技術時,在 sys.modules 分配後可能無法存取其他模組元素。在替換類別中定義所有必要的功能,以避免遺失模組內容。

__all__ 屬性

使用 from module import * 時,在替換類別中定義 __all__ 來處理此問題導入聲明的類型。省略 __all__ 中的 __module__ 和 __qualname__ 等屬性。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3