将装饰器添加到库中的方法 class
Add decorator to method from library class
我有一个无法更改的 class(它来自图书馆),它可能看起来像
class Test(object):
def __init__(self):
pass
def bar(self, x):
return x
并且我想在Test
中的bar
方法中添加一个装饰器,如下所示,例如:
from functools import wraps
def some_decorator(fn):
@wraps(fn)
def wrapped(*args, **kwargs):
return "<b>" + fn(*args, **kwargs) + "</b>"
return wrapped
通过“添加”装饰器,我的意思是有一种方法可以生成将 bar
方法包装在 some_decorator
中的对象。
但是,我无法更改 Test
中的代码,这使我的问题变得更加困难。有没有一种简单的方法可以在我无法在 python 中更改的 class 方法中添加装饰器?
你可能知道装饰器只是一个函数,它接受一个函数作为参数和 returns 一个新函数,因此你可以按照 nasty-hacky monkeypatching:
import your_library
your_library.Test.your_function = your_decorator(your_library.Test.your_function)
如果你不想修改原来的 class 定义,那么你可以通过简单的继承本身来实现这一点,而不是使用装饰器..
class Test(object):
def __init__(self):
pass
def bar(self, x):
print("In base bar..")
return x
class DerivedTest(Test):
def __init__(self):
super().__init__()
def bar(self,x):
print("In derive's bar..")
super().bar(x)
现在执行时说:
dt=DerivedTest()
dt.bar(10)
输出将是
In derive's bar..
In base bar..
您可以在 super() 调用前后放置您想要的任何包装代码..
我有一个无法更改的 class(它来自图书馆),它可能看起来像
class Test(object):
def __init__(self):
pass
def bar(self, x):
return x
并且我想在Test
中的bar
方法中添加一个装饰器,如下所示,例如:
from functools import wraps
def some_decorator(fn):
@wraps(fn)
def wrapped(*args, **kwargs):
return "<b>" + fn(*args, **kwargs) + "</b>"
return wrapped
通过“添加”装饰器,我的意思是有一种方法可以生成将 bar
方法包装在 some_decorator
中的对象。
但是,我无法更改 Test
中的代码,这使我的问题变得更加困难。有没有一种简单的方法可以在我无法在 python 中更改的 class 方法中添加装饰器?
你可能知道装饰器只是一个函数,它接受一个函数作为参数和 returns 一个新函数,因此你可以按照 nasty-hacky monkeypatching:
import your_library
your_library.Test.your_function = your_decorator(your_library.Test.your_function)
如果你不想修改原来的 class 定义,那么你可以通过简单的继承本身来实现这一点,而不是使用装饰器..
class Test(object):
def __init__(self):
pass
def bar(self, x):
print("In base bar..")
return x
class DerivedTest(Test):
def __init__(self):
super().__init__()
def bar(self,x):
print("In derive's bar..")
super().bar(x)
现在执行时说:
dt=DerivedTest()
dt.bar(10)
输出将是
In derive's bar..
In base bar..
您可以在 super() 调用前后放置您想要的任何包装代码..