[英]How do I decorate an instance method with another class in Python 2.7?
[英]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.app
或self
成员的self.app
,并在调用时引用self.app
. 这基本上就是你的self_decorator
所做的,这是不可避免的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.