1

我试图在定义类时包装一个函数,在这个类的实例中使用方法

下面是一个有效的代码

class A(object):   
    def __init__(self):    
        pass       

    @self_decorator 
    def to_be_decorated(self):
        pass       

def self_decorator(fn):    
    from functools import wraps
    @wraps(fn)     
    def wrapper(*args, **kwargs):
        self = args[0]     
        return self.app.route('/twip')(fn(*args, **kwargs))

    return wrapper

我实际上试图得到什么:

class A(object):   
    def __init__(self):    
        self.app = APP()    

    @self.app.wrapper_function # which apparently doesn't work
    def to_be_decorated(self):
        pass

那么,我的装饰方式有可能奏效吗?

4

2 回答 2

2

在类定义中没有自我,因为该类还不存在并且无法实例化。

您可以使用

class A(object):
    app = APP()

    @app.wrapper_function
    def to_be_decorated(self):
        pass

但这将是一个类变量。

于 2012-11-14T01:01:18.350 回答
0

装饰器只是一个在定义时被调用的函数。

当你写这个:

@self.app.wrapper_function # which apparently doesn't work
def to_be_decorated(self):
    pass

它与写这个大致相同:

def to_be_decorated(self):
    pass
to_be_decorated = self.app.wrapper_function(to_be_decorated)

一旦你这样看,很明显为什么这不起作用,而且不可能起作用。

首先,A的类定义没有 self 变量,也没有即使有也可以访问A的成员。app相反,每个实例A都有自己独特的self.app.

即使您希望口译员可以“按照我的意思做”,但如果您考虑一下,那也没有任何意义。你想调用“the”self.app.wrapper_function方法,但没有这样的东西。除非您在可以定义或重新定义方法的所有地方通读所有相关代码,否则绝对不能保证self.app.wrapper_function来自不同实例Afunc_code. 但是,即使他们这样做了,self.app.wrapper_function也是一个绑定方法——一个与调用它的对象绑定在一起的方法——所以它们仍然彼此不同。

有很多方法可以解决这个问题,但它们都是相同的技巧:使用某种间接来获取一个不是self.appor成员的函数self,并在调用时引用self.app。这基本上就是你self_decorator所做的,这是不可避免的。

于 2012-11-14T01:54:58.863 回答