繁体   English   中英

是否可以在 Python 中使用实例中的方法来装饰类中的方法

[英]Is it possible in Python to decorate a method in class using method in instance

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

下面是一个有效的代码

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

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

在类定义中没有 self ,因为该类尚不存在且无法实例化。

您可以使用

class A(object):
    app = APP()

    @app.wrapper_function
    def to_be_decorated(self):
        pass

但这将是一个类变量。

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

当你写这个:

@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方法,但没有这样的东西。 除非您在任何可以定义或重新定义方法的地方通读所有相关代码,否则绝对不能保证来自A不同实例的self.app.wrapper_function甚至具有相同的底层func_code 但是,即使他们这样做了, self.app.wrapper_function是一个绑定方法——一个与它被调用的对象绑定在一起的方法——所以它们仍然彼此不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM