функция Python-Decorator внутри класса - PullRequest
2 голосов
/ 20 марта 2019

У меня есть приведенный ниже код, который прекрасно работает, если я удаляю self из методов

class tests:
    def __init__(self):
        pass
    def func(self,a):
        def wrapp(x):
            y=x+2
            return a(y)
        return wrapp
    @func
    def func1(self,b):
        return b

print (tests.func1(10))

Я считаю, что функция декоратора - это функции, которые возвращают другую функцию.Разве это не сработает внутри класса?Проигнорируйте ошибку отступа, так как я не достигаю этого, когда вставляю код здесь .. Пожалуйста, помогите мне, как я могу достичь этого сценария в классе ..

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вы можете просто объявить своего декоратора за пределами класса.Кроме того, когда вы декорируете метод класса, кажется, что вам нужно передать переменную self из оболочки в декорированную функцию (изменили имена для большей ясности):

def add_two(fn):
    def wrapper(self, x):
        y = x + 2
        return fn(self, y) 
    return wrapper

class Test:
    @add_two
    def func1(self, b):
        return b

f = Test()
f.func1(5) # returns 7
1 голос
/ 20 марта 2019

Эта проблема вообще не является декоратором. Эта проблема заключается в том, что вы используете func1 и ваш декоратор в качестве статических методов, не удаляя аргумент self. Если вы удалите аргументы self, это будет работать нормально.

Без статического метода декоратора

class Test:
    def add_two(func=None):
        def wrapper_add_two(*args, **kwargs):
            return func(*args, **kwargs) + 2
        return wrapper_add_two

    @add_two
    def func1(b):
        return b

print(Test.func1(10)) #12

С декоратором статического метода

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

class Test:
    @staticmethod
    def add_two(func):
        def wrapper_add_two(*args, **kwargs):
            return func.__func__(*args, **kwargs) + 2
        return wrapper_add_two

    @add_two.__func__
    @staticmethod
    def func1(b):
        return b

print(Test.func1(10)) #12

Запуск с декоратором staticmethod и без привязки функции дает вам

TypeError: объект «staticmethod» не может быть вызван

...