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
vs
obj
的目录

打印(目录(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
的引用。