我有一個 A 類,它有很多舊的復雜方法,我已經重寫了。
class A:
def __init__(self):
self.x = 1
def old_func(self):
return 2
@property
def b(self):
if not hasattr(self, 'b'):
self._b = B(self)
return _b
class B:
def __init__(self, a: A):
self.a = a
def new_func(self):
return 2
我想逐漸替換a.old_func為`a.new_func。但首先,我想確保新方法始終以與舊方法相同的方式作業。所以我寫了一個裝飾器來檢查:
def refactor_factory(new_func):
def refactor(old_func):
def _wrapper(*args, **kwargs):
old_return_value = old_func(*args, **kwargs)
new_return_value = new_func(**kwargs)
if old_return_value != new_return_value:
raise Exception("Mismatch") # Add a complete log info
return old_return_value
return _wrapper
return refactor
我想這樣稱呼它:
class A:
def __init__(self):
self.x = 1
@refactor_factory(self.b.new_func)
def old_func(self):
return 2
def new_func(self):
return 2
問題是我無法將 new_func 傳遞給裝飾器。我知道我可以self在裝飾器中訪問,但是在傳遞引數時,我無權訪問它,因此我無法傳遞它的方法。有沒有辦法可以做到這一點?
ps 我知道有不同的設計來實作我想要的,就像下面的那樣,我只是覺得第一種方式更干凈。
def refactor(old_func):
def _wrapper(*args, **kwargs):
self = args[0]
if isinstance(old_func, self.old_func):
new_func = self.b.new_func
old_return_value = old_func(*args, **kwargs)
new_return_value = new_func(**kwargs)
if old_return_value != new_return_value:
raise Exception("Mismatch") # Add a complete log info
return old_return_value
return _wrapper
class A:
def __init__(self):
self.x = 1
@refactor_factory
def old_func(self):
return 2
def new_func(self):
return 2
uj5u.com熱心網友回復:
我認為你可以通過A.new_func。在包裝器中,self將是 之一*args,因此它將正確傳遞。
class A:
def __init__(self):
self.x = 1
@refactor_factory(A.new_func)
def old_func(self):
return 2
def new_func(self):
return 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/418839.html
標籤:
