![](/img/trans.png)
[英]How do I decorate an instance method with another class in Python 2.7?
[英]Python, how to alter a method of another class' instance
我想為另一個類實例的方法添加一些小功能。 下面列出了我嘗試過的內容。 使用相同的方法,可以完全改變方法。 但我想保留原始方法的略微改動版本。 那可能嗎?
順便說一句:這些類不能相互繼承,因為我不一定知道 class B 是什么。
class A:
def alter_fn(self, obj):
def wrapper():
func = getattr(obj, obj.fn_name)
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
class B:
def __init__(self) -> None:
self.fn_name = 'fn'
def fn(self):
return 123
a=A()
b=B()
a.alter_fn(b)
b.fn()
由於顯而易見的原因,這會引發遞歸深度錯誤,但我不知道如何避免這種情況。 我也試過func = copy(getattr(obj, obj.fn_name))
更改方法 b.fn 后,我希望它返回值,未更改的 function 將返回(此處為 123),但我也希望它對 output 執行其他操作,在此示例中打印它。
將func
的賦值移到wrapper
的定義之上。
...
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
...
這樣getattr
只被調用一次,並且wrapper
可以將func
作為閉包變量訪問。
您只需將func = getattr(obj, obj.fn_name)
從wrapper
function 中取出。
class A:
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
您需要在重新分配之前獲取包裝的 function :
def alter_fn(self, obj):
func = getattr(obj, obj.fn_name)
def wrapper():
out = func()
print('out = ', out)
return out
setattr(obj, obj.fn_name, wrapper)
return
這種方式func
只分配一次,當原始的 function 被調用時。 因此,您可以安全地調用它,而不會意外再次調用wrapper()
。
還可以考慮使用functools.wraps()
來保持字符串的文檔字符串和名稱信息相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.