以下代码:
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类型的类变量。
@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
演示: