Декоратор и наследование с параметрами

avatar
Jackiemiao
8 апреля 2018 в 01:55
61
1
-1

Есть декоратор с наследованием. Работает хорошо:

class bar(object):
    def __init__(self,val):
        self.val = val

    @staticmethod
    def decor(func):
        def increment(obj, x):
            return func(obj, x) + obj.val
        return increment

class foo(bar):
    def __init__(self):
        bar.__init__(self)

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

Но я хочу добавить параметр в class foo:

class foo(bar):
    def __init__(self,B):
        bar.__init__(self)
        self.B = B

И я хочу ввести B в декоратор в качестве параметров, я пробовал царапину:

class bar(object):
    def __init__(self,val):
        self.val = val

    @staticmethod
    def decor(B):
        def wrap(func):
            def increment(obj, x):
                return func(obj, x) + obj.val + B
            return increment
        return wrap

class foo(bar):
    def __init__(self,B):
        bar.__init__(self)
        self.B = B

    @bar.decor(B)
    def add(self, x):
        return x

Но это не сработало. Что я делаю не так?

Источник
zwer
8 апреля 2018 в 02:04
0

Откуда вы взяли B в украшении @bar.decor(B)?

martineau
8 апреля 2018 в 02:40
0

Откуда в методе __init__() для class foo(bar) берется переменная с именем B, используемая в правой части присваивания в выражении self.B = B?

Andrey Tyukin
8 апреля 2018 в 02:59
0

То, что вы пытаетесь сделать, кажется невозможным. Все декораторы выполняются во время импорта, как только методы определены. Они не ждут, пока будет создан экземпляр класса. Следовательно, они не могут зависеть от значений, переданных в __init__.

Ответы (1)

avatar
Jackiemiao
8 апреля 2018 в 14:31
0
class bar(object):
    def __init__(self, val):
        self.val = val

    @staticmethod
    def decor(func):
        def increment(obj, x):
            return func(obj, x) + obj.val + obj.B
        return increment

class foo(bar):
    def __init__(self,val,B):
        bar.__init__(self,val)
        self.B = B

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

aa = foo(4, 1.5)
a = aa.add(1)
print(a)
Andrey Tyukin
8 апреля 2018 в 19:45
0

Не могли бы вы добавить хотя бы краткое объяснение того, что вы здесь делали? Это выглядит почти как дословная копия первой части вопроса, с той разницей, что во внутренней функции increment появляется дополнительная функция + obj.B.

Jackiemiao
9 апреля 2018 в 10:04
0

Я просто хочу создать декоратор для работы с функцией class foo, которая унаследована от class bar и имеет собственный параметр B как часть декоратора.