Python 为什么在继承类中使用django.utils.decorators方法\u decorator时需要重复方法定义
您好,我正在尝试理解django.utils.decorators方法\u decorator decorator。 方法修饰符将函数修饰符转换为类方法修饰符 此装饰程序的源代码位于(https://github.com/django/django/blob/master/django/utils/decorators.py) 我的示例函数装饰器:Python 为什么在继承类中使用django.utils.decorators方法\u decorator时需要重复方法定义,python,inheritance,decorator,django-class-based-views,Python,Inheritance,Decorator,Django Class Based Views,您好,我正在尝试理解django.utils.decorators方法\u decorator decorator。 方法修饰符将函数修饰符转换为类方法修饰符 此装饰程序的源代码位于(https://github.com/django/django/blob/master/django/utils/decorators.py) 我的示例函数装饰器: def run_eight_times(myfunc): def inner_func(*args, **kwargs):
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方法\u decorator来装饰Myclass方法undecorated\u函数。
要使方法_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
如何在子类中修饰函数而不重新定义它?
self
不存在于该范围中-它只存在于方法中,并且只存在于方法中,因为它是作为第一个参数传递的
实现这一点的方法是重写该方法,只需调用超级类方法:
@method_decorator(run_eight_times)
def undecorated_function(self):
super(Myrepetitiveclass, self).undecorated_function()
另外,还有两条关于其他代码的注释:如果您只是调用父方法,那么重写
\uuu init\uuu
方法是没有意义的,但是如果您确实需要,您应该像我在这里所做的那样使用super
,而不是使用超类本身的名称。谢谢您的帮助。我有另一个问题,它是相关的,我不想开始一个新的线程。为什么在上面的代码中需要django.utils.decorators@method\u decorator。即使“运行”了八次,仍然可以用相同的结果装饰未修饰的函数