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

2024-03-29 07:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想确保我正确理解了decoratoras类是如何工作的

假设我有一个decorator作为一个函数,它向对象添加一个属性

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
        # ???

Tags: 对象函数objreturn属性initdef装饰
1条回答
网友
1楼 · 发布于 2024-03-29 07:49:14

你可以像这样写一个等价的基于类的装饰器

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

相关问题 更多 >