我正在嘗試從帶有裝飾器的自定義類創建一個物件。然后我需要使用該物件的裝飾器在不同的檔案中創建一堆函式。我在網上找到了使用內置函式的解決方案,但感覺有點笨拙,讓我的 lsp 吐出一堆錯誤。
我想知道是否有人知道更好的解決方案。
這是我的檔案結構:
main.py
mylib
├── A.py
└── B.py
主檔案
import builtins
from mylib.A import A
a = A("This is printing in the decorator")
builtins.FOO = a
import mylib.B as B
B.foo()
B.poo()
py
class A:
def __init__(self, _message):
self.message = _message
def our_decorator(self, func):
def function_wrapper():
print(self.message)
func()
return function_wrapper
B.py
import builtins
@builtins.FOO.our_decorator
def foo():
print("foo")
@builtins.FOO.our_decorator
def poo():
print("poo")
如果可以避免,我不想更改檔案結構。
uj5u.com熱心網友回復:
使用內置函式來擁有一個神奇地創建的裝飾器確實是 hacky。
另一種方法是從 main 修補 B 中的函式。它稍微干凈一點(并且 linters 不應該抱怨),因為 B 模塊不再需要知道裝飾器:
主要.py:
from mylib.A import A
a = A()
import mylib.B as B
# decorate here the functions of the B module
B.foo = a.our_decorator(B.foo)
B.poo = a.our_decorator(B.poo)
B.foo()
B.poo()
A.py 不變...
B.py:
def foo():
print("foo")
def poo():
print("poo")
由于一個行程中只存在一個模塊版本,您甚至可以使用第三個模塊中的 B 的功能,前提是:
- 要么是裝修后進口
- 或者它只匯入模塊名稱 (
import mylib.B as B) 而不是直接匯入函式 (from mylib.B import foo)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311003.html
標籤:Python python-装饰器 蟒蛇模块
上一篇:如何正確地將日期時間轉換為字串?
