我的問題是看起來象下面這樣:如何使用裝飾器將參數綁定到靜態方法函數?
class foo(obj):
def __init__(self, st='123'):
self.st = st
def process(self, x):
self.st += x
@staticmethod
def do_foo(x, myfoo=None):
if myfoo is None:
myfoo = foo()
myfoo.process(x)
def wrapper(fn, st):
foo_func = foo(st)
foo.do_foo = functools.partial(foo.do_foo, myfoo=foo_func)
fn()
print foo_func.st
return wrap
@wrapper('stst')
def pro():
foo.do_foo('double')
def pro2():
foo.do_foo('double')
pro2() # <--- normal foo.do_foo
pro() # <--- partialed foo.do_foo
pro2() # <--- partialed foo.do_foo
我想創建wrapper
裝飾爲包裝的靜態方法foo.do_foo
與定製foo
類和pro()
執行後,這個裝飾能夠跨越Foo對象做一些工作。即保存變量值。
在上面的代碼中,每個包裝器如何在全局範圍內永久更改foo.do_foo
,而不僅僅是在修飾器範圍中對其進行更改。
那麼如何讓foo.do_foo
只在修飾器範圍內更改而不是全局?
PLZ看到這個代碼https://gist.github.com/tywtyw2002/c885bd917430e0563288,爲什麼'C'打印'do_p2do2 do'代替單曲do'。我想要這樣的代碼,如果有裝飾器在裝飾器中更改字符串參數,沒有裝飾器字符串應該提醒默認值。 – tywtyw2002
問題是類和它的靜態方法是有效的全局變量,當你用'functools.partial()'改變後者時,最後賦值被所有後續調用使用。如果我想出解決方案,我會更新我的答案。 – martineau
查看最新的更新,我認爲可能會完成你想要做的事情。 – martineau