Python 中带有参数的类装饰器,引发 TypeError:缺少 1 个必需的位置参数:'type'

问题描述 投票:0回答:1

以下代码:

    def myDecorator(cls, type):
        class wrapper(cls):
            contaVarClasse = 0
    
            def __init__(cls, *args, **kwargs):
                for value in cls.__dict__.values():
                    if isinstance(value, type):
                        cls.contaVarClasse += 1
                print(cls.__dict__)
    
        return wrapper
    
    @myDecorator(str)
    class MyClass:
        countme = "b"
        notme = 2
        def __init__(self):
            dontcountme = "a"
            norme = 5
    
    print(MyClass.contaVarClasse)

引发“TypeError:缺少 1 个必需的位置参数:'type'”错误

据我所知,@myDecorator(str)应该等于MyClass = myDecorator(MyClass, str),但我显然错了,到目前为止我几乎找不到我做错了什么。

在谷歌搜索“带参数的装饰器”和“带参数的类装饰器”和“TypeError:缺少 1 个必需的位置装饰器”40 分钟后,我发现所有问题和答案都与应用于类方法的装饰器相关,并且没有人真正尝试用另一个类来装饰一个类。

如果这个问题激怒了您,我深表歉意。请理解我并不是想懒惰地抛出这个问题。

所以对于任何想知道的人来说,类装饰器“myDecorator”应该用一个变量(contaVarClasse)装饰MyClass,该变量应该计算装饰类中有多少个type类型的类变量

python python-decorators python-3.10 class-decorator
1个回答
0
投票
如果您希望能够使用像

@myDecorator(str)

 这样的调用来配置装饰器,您应该创建 
myDecorator
 一个返回装饰器函数的装饰器工厂函数:

def decorator_factory(type_): def decorator(cls): class wrapper(cls): contaVarClasse = sum(isinstance(value, type_) for value in vars(cls).values()) return wrapper return decorator
这样:

@decorator_factory(str) class MyClass: countme = "b" notme = 2 print(MyClass.contaVarClasse)
输出:

2
演示:

https://ideone.com/OEaloD

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