Python 为什么在继承类中使用django.utils.decorators方法\u decorator时需要重复方法定义

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):

您好,我正在尝试理解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):
        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。即使“运行”了八次,仍然可以用相同的结果装饰未修饰的函数