python—如何将值传递给类装饰器?
我有一个类装饰器,它有两个参数,如下所示:python—如何将值传递给类装饰器?,python,python-decorators,Python,Python Decorators,我有一个类装饰器,它有两个参数,如下所示: def decoratorB(x: int, y: int): def inner(cls): def no_wrap(*args, **kwargs): return cls(*args, **kwargs) no_wrap.x = x no_wrap.y = y return no_wrap return inner 我用它来装饰一个班级
def decoratorB(x: int, y: int):
def inner(cls):
def no_wrap(*args, **kwargs):
return cls(*args, **kwargs)
no_wrap.x = x
no_wrap.y = y
return no_wrap
return inner
我用它来装饰一个班级:
@decoratorB(x=100, y=-100)
class ClassB():
def func(self, name):
pass
如何从ClassB
的对象中获取x和y的值
obj = ClassB()
提前感谢。尝试打印
ClassB
vsobj
的目录
打印(目录(obj))
#[“类”、…、“函数”]
>>>打印(目录(B类))
#[“注释”、…、“x”、“y”]
请注意,x
和y
仅作为类而不是类的实例出现在ClassB中。还要注意如何仅在实例中找到func
。这是因为您如何定义装饰器。我们将属性应用于no_wrap
,而不是obj本身。您可以在
\uuuu init\uuuu
中手动设置属性,也可以更改装饰器
@decororb(x=100,y=-100)
B类:
定义初始化(自):
对于目录中的attr(ClassB)[35::]:#去掉内置方法,这样我们就不会重写
setattr(self、attr、getattr(ClassB、attr、None))
def func(自我,姓名):
通过
>>>打印(目录(类())
#[“类”、…、“func”、“x”、“y”]
编辑:多亏了切普纳的评论,我意识到我们可以直接重写装饰器
我们应该获取cls对象并将值分配给该对象,而不是“副本”
def decorborb(x:int,y:int):
def内部(cls):
新=cls
新的.x=x
new.y=y
还新
返回内部
>>>打印(目录(B类))
#[uuuuuuuuuuuuuuuuuu类,func类,x类,y类]
>>>打印(dir(ClassB()))
#[uuuuuuuuuuuuuuuuuu类,func类,x类,y类]
您确实意识到您正在用函数替换类,对吗?
ClassB
成为函数的另一个名称no_wrap
,因此x
和y
可以作为ClassB.x
访问,而ClassB.y
obj
是函数返回的原始类的实例ClassB,不包含对x
或y
的引用。