Python Декораторы и наследование - PullRequest
16 голосов
/ 09 июня 2010

Помоги парню. Не получается заставить декоратор работать с наследованием. Разбери это до самого простого маленького примера в моем рабочем пространстве. По-прежнему не могу заставить его работать.

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

Упс, название "декор" не определено.

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

Хорошо, а как же @self.decor? Имя «Я» не определено.

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

AaaaAAaAaaaarrrrgggg ... Что я делаю не так?

1 Ответ

20 голосов
/ 09 июня 2010

Определите 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
...