Nazime Lakehal
Nazime Lakehal

Reputation: 1782

Limit of decorator as class compared to decorator as function

I want to make sure that I understood correctly how decorator as class works.

Let's say i have a decorator as a function that add an attribute to an object

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

@addx
class A:
    pass

assert A.x == 10

Is it possible to write the same decorator as a class decorator? since the class decorator can't return the object itself with __init__

class addx:
    def __init__(self, obj):
        obj.x = 10
        # ???

Upvotes: 0

Views: 150

Answers (1)

larsks
larsks

Reputation: 311625

You could write an equivalent class-based decorator like this...

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

@addx
class A:
    pass

assert A.x == 10

...but I don't think this really gets you anything. The utility of a class-based decorator becomes more apparent when your goal is to modify objects of class A, rather than class A itself. Compare the following two decorators, one function based and one class based:

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

Upvotes: 1

Related Questions