装饰器作为类的限制与装饰器作为函数的限制

我想确保我正确理解装饰器作为类的工作原理。

假设我有一个装饰器作为向对象添加属性的函数

def addx(obj):
    obj.x = 10
    return obj

@addx
class A:
    pass

assert A.x == 10

是否可以编写与类装饰器相同的装饰器?因为类装饰器无法使用__init__

返回对象本身
class addx:
    def __init__(self,obj):
        obj.x = 10
        # ???
bigworm01 回答:装饰器作为类的限制与装饰器作为函数的限制

您可以像这样编写等效的基于类的装饰器...

class addx:
    def __new__(self,obj):
        obj.x = 10
        return obj

@addx
class A:
    pass

assert A.x == 10

...但是我不认为这真的能给您带来任何好处。当您的目标是修改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
本文链接:https://www.f2er.com/2998718.html

大家都在问