作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类装饰器,它有两个参数如下:
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
与 obj
的目录。
>>> print(dir(obj))
# ['__class__', ..., 'func']
>>> print(dir(ClassB))
# ['__annotations__', ..., 'x', 'y']
请注意 x
和 y
是如何在 ClassB 中作为类而不是它的实例找到的。还要注意 func
是如何只在实例中找到的。这是因为您如何定义装饰器。我们将属性应用到 no_wrap
而不是 obj 本身。
您可以在 __init__
中手动设置属性或更 retrofit 饰器。
@decoratorB(x=100, y=-100)
class ClassB:
def __init__(self):
for attr in dir(ClassB)[35:]: # Get rid of builtin methods so we don't override
setattr(self, attr, getattr(ClassB, attr, None))
def func(self, name):
pass
>>> print(dir(Class())
# ['__class__', ..., 'func', 'x', 'y']
编辑:感谢 chepner 的评论,我意识到我们可以改写装饰器。
我们应该获取 cls 对象并将值分配给对象而不是“复制”。
def decoratorB(x: int, y: int):
def inner(cls):
new = cls
new.x = x
new.y = y
return new
return inner
>>> print(dir(ClassB))
# ['__class__', 'func', 'x', 'y']
>>> print(dir(ClassB()))
# ['__class__', 'func', 'x', 'y']
关于python-如何将值传递给类装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67389792/
我是一名优秀的程序员,十分优秀!