在Python中从类外部包装方法

时间:2017-06-30 14:46:43

标签: python methods decorator wrapping

假设我有一些名为 TheClass 的导入类和一个方法 sth(arg)

我有什么:

var = TheClass()
var.sth('blah')

我想要的是什么:

var = TheClass()
var.wrapped_sth()

其中wrapped_sth类似于:

def wrapped_sth():
    sth('blah')

我已经知道它应该用装饰器来完成,但是我已经找到的所有例子都是你可以访问 TheClass 实现的情况,我没有这种情况,我没有想要覆盖。

希望描述清楚。你能救我吗?

2 个答案:

答案 0 :(得分:3)

我的建议是扩展TheClass以包装函数。

class MyClass(TheClass):
   def wrapped_sth(self):
       return self.sth('blah')

现在您可以创建var = MyClass(),并根据需要致电var.wrapped_sth()MyClass将继承TheClass中的所有功能。

答案 1 :(得分:2)

您错误地对装饰器进行编码,以纠正错误:

def decorator_sth(func):
    def wrapper():
        return func('blah')
    return wrapper

现在使用decorator_sth包装方法:

var.sth = decorator(var.sth)         # this call returns wrapper

decorator_sth接受一个函数并返回一个包装函数。 func是装饰函数,wrapper是包装函数。 wrapper函数从func的本地范围保留封闭范围中的decorator_sth

这是一个典型的装饰者;它将函数或可调用对象作为参数,并返回可调用本身或其周围的包装器对象。