Class中的python-Decorator函数

问题描述 投票:2回答:2

如果我从方法中删除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))

我相信装饰器功能是返回另一个功能的功能。在课堂上不行吗?忽略缩进错误,因为我在这里粘贴代码时无法实现..请帮助我如何在类中实现这个场景..

python python-decorators
2个回答
2
投票

你可以在课堂外声明你的装饰者。此外,在装饰类方法时,似乎需要将自变量从包装器传递到修饰函数(更改名称以更清晰):

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
投票

这里的问题根本不是装饰者。这个问题是你使用func1和装饰器作为静态方法而不删除self参数。如果你删除自我参数,这将工作正常。

没有staticmethod装饰器

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

使用staticmethod装饰器

不幸的是,以这种方式使用它们将它们存储为未绑定的静态方法,您需要使用bind them才能正常工作。

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'对象不可调用

© www.soinside.com 2019 - 2024. All rights reserved.