在对另一个问题的答案的评论中,有人说他们不确定functools.wraps在做什么.所以,我问这个问题,以便在StackOverflow上有一个记录,供将来参考:究竟functools.wraps做了什么?
嗨我有类似下面的东西.基本上我需要从定义中的实例方法使用的装饰器访问实例方法的类.
def decorator(view):
# do something that requires view's class
print view.im_class
return view
class ModelA(object):
@decorator
def a_method(self):
# do some stuff
pass
Run Code Online (Sandbox Code Playgroud)
代码原样给出
AttributeError: 'function' object has no attribute 'im_class'
我发现类似的问题/答案 - Python装饰器让函数忘记它属于一个类和Python装饰器中的Get类 - 但这些依赖于一种解决方法,它通过抢夺第一个参数在运行时抓取实例.在我的情况下,我将基于从其类中收集的信息调用该方法,因此我不能等待来电.
谢谢.
我有一个函数,它将另一个函数作为参数.如果函数是类的成员,我需要找到该类的名称.例如
def analyser(testFunc):
print testFunc.__name__, 'belongs to the class, ...
Run Code Online (Sandbox Code Playgroud)
我想
testFunc.__class__
Run Code Online (Sandbox Code Playgroud)
会解决我的问题,但这只是告诉我testFunc是一个函数.
举个例子,
def get_booking(f=None):
print "Calling get_booking Decorator"
def wrapper(request, **kwargs):
booking = _get_booking_from_session(request)
if booking == None:
# we don't have a booking in our session.
return HttpRedirect('/')
else:
return f(request=request, booking=booking, **kwargs)
return wrapper
@get_booking
def do_stuff(request, booking):
# do stuff here
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,甚至在我调用我正在装饰的函数之前,就会调用@get_booking装饰器.
开始输出:
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
Calling get_booking Decorator
[26/Oct/2008 19:54:04] "GET /onlinebooking/?id=1,2 HTTP/1.1" …Run Code Online (Sandbox Code Playgroud) 当创建用于类方法的装饰器时,我在装饰器机制是一个类而不是一个函数/闭包时遇到了麻烦.使用类窗体时,我的装饰器不会被视为绑定方法.
通常我更喜欢使用函数表单来装饰器,但在这种情况下,我必须使用现有的类来实现我需要的东西.
这好像它可能与python-decorator-makes-function-forget-it-it-it-a-class有关,但为什么它对函数形式起作用呢?
这是我可以用来表示所有事情的最简单的例子.抱歉,代码数量:
def decorator1(dec_param):
def decorator(function):
print 'decorator1 decoratoring:', function
def wrapper(*args):
print 'wrapper(%s) dec_param=%s' % (args, dec_param)
function(*args)
return wrapper
return decorator
class WrapperClass(object):
def __init__(self, function, dec_param):
print 'WrapperClass.__init__ function=%s dec_param=%s' % (function, dec_param)
self.function = function
self.dec_param = dec_param
def __call__(self, *args):
print 'WrapperClass.__call__(%s, %s) dec_param=%s' % (self, args, self.dec_param)
self.function(*args)
def decorator2(dec_param):
def decorator(function):
print 'decorator2 decoratoring:', function
return WrapperClass(function, dec_param)
return decorator
class Test(object):
@decorator1(dec_param=123)
def member1(self, value=1):
print 'Test.member1(%s, %s)' …Run Code Online (Sandbox Code Playgroud) 假设我有一堂课
class A(object):
def myfunction():
"""A."""
pass
Run Code Online (Sandbox Code Playgroud)
和一个子类
class B(A):
def myfunction():
pass
Run Code Online (Sandbox Code Playgroud)
是否可以使用sphinx从A.myfunction继承B.myfunction的API文档?B.myfunction的文档应为"A".同样.