2024-03-29 07:49:14 发布
网友
我想确保我正确理解了decoratoras类是如何工作的
假设我有一个decorator作为一个函数,它向对象添加一个属性
def addx(obj): obj.x = 10 return obj @addx class A: pass assert A.x == 10
是否可以编写与类装饰器相同的装饰器?因为类装饰器不能返回带有__init__的对象本身
__init__
class addx: def __init__(self, obj): obj.x = 10 # ???
你可以像这样写一个等价的基于类的装饰器
class addx: def __new__(self, obj): obj.x = 10 return obj @addx class A: pass assert A.x == 10
…但我不认为这能给你带来什么。当您的目标是修改class A的对象而不是class A本身时,基于类的装饰器的实用性变得更加明显。比较以下两个装饰器,一个基于函数,一个基于类:
class A
def addx_func(kls): def wrapper(): res = kls() res.x = 10 return res return wrapper class addx_class: def __init__(self, kls): self.kls = kls def __call__(self): res = self.kls() res.x = 10 return res @addx_func class A: pass @addx_class class B: pass a = A() assert a.x == 10 b = B() assert b.x == 10
你可以像这样写一个等价的基于类的装饰器
…但我不认为这能给你带来什么。当您的目标是修改
class A
的对象而不是class A
本身时,基于类的装饰器的实用性变得更加明显。比较以下两个装饰器,一个基于函数,一个基于类:相关问题 更多 >
编程相关推荐