【发布时间】:2012-03-22 09:19:24
【问题描述】:
您好,我正在尝试了解 django.utils.decorators method_decorator 装饰器。 method_decorator 将函数装饰器转换为类方法装饰器。
此装饰器的来源位于 (https://github.com/django/django/blob/master/django/utils/decorators.py)
我的示例函数装饰器:
def run_eight_times(myfunc):
def inner_func(*args, **kwargs):
for i in range(8):
myfunc(*args, **kwargs)
return inner_func
我的示例基类:
class Myclass(object):
def __init__(self,name,favorite_dish):
self.name = name
self.favorite_dish = favorite_dish
def undecorated_function(self):
print "%s likes spam in his favorite dish %s" % (self.name,self.favorite_dish)
现在我想创建一个继承类,它使用 django.utils.decorators 方法_decorator 来装饰 Myclass 方法 undecorated_function。 为了让 method_decorator 工作,我需要在继承的类中重新定义函数。
所以这行得通:
class Myrepetitiveclass(Myclass):
def __init__(self,*args, **kwds):
Myclass.__init__(self,*args,**kwds)
@method_decorator(run_eight_times)
def undecorated_function(self):
print "%s likes spam in his favorite dish %s" % (self.name,self.favorite_dish)
noisier_me = Myrepetitiveclass("harijaynoisyclass","moreeggs")
noisier_me.undecorated_function()
我有点困惑,不知道为什么下面的代码不起作用并给出语法错误。
这不会被正确解释并给出语法错误。
class Myrepetitiveclass(Myclass):
def __init__(self,*args, **kwds):
Myclass.__init__(self,*args,**kwds)
# Why does this not work? and gives a syntax error?
@method_decorator(run_eight_times)
self.undecorated_function
如何在不重新定义子类的情况下装饰函数?
【问题讨论】:
标签: python inheritance decorator django-class-based-views