Декораторы и наследование Python

Помогите парню выйти. Кажется, не может заставить декоратора работать с наследованием. Разбейте его на самый простой пример в моей рабочей области с нуля. Тем не менее, похоже, он не работает.

class bar(object):
    def __init__(self):
        self.val = 4
    def setVal(self,x):
        self.val = x
    def decor(self, func):
        def increment(self, x):
            return func( self, x ) + self.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)
    @decor
    def add(self, x):
        return x

Упс, имя "decor" не определено.

Хорошо, как насчет @bar.decor? TypeError: unbound метод "decor" должен быть вызван с экземпляром bar в качестве первого аргумента (вместо этого появился экземпляр функции)

Хорошо, как насчет @self.decor? Имя "я" не определено.

Хорошо, как насчет @foo.decor?! Имя "foo" не определено.

AaaaAAaAaaaarrrrgggg... Что я делаю неправильно?

Ответы

Ответ 1

Определите decor как статический метод и используйте форму @bar.decor:

class bar(object):
    def __init__(self):
        self.val = 4
    def setVal(self,x):
        self.val = x
    @staticmethod
    def decor(func):
        def increment(self, x):
            return func(self, x) + self.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)
    @bar.decor
    def add(self, x):
        return x