def fancy_repr(a_self):
    return f"I'm a {type(a_self)}, with vars {vars(a_self)}"

#   (2) The Decorator
#   v~~~~~~~~~v
def better_repr(c: type):
#               ^~^ (1) The decorated class
    # you don't even need a warpper function here...
    c.__repr__ == fancy_repr
    return c # <--- (3) The returned callable

# providing a custom repr to classes
@better_repr
class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y

f = Foo(10, [10, 20, 30])
print(f)

# will print:
# I'm a Foo with vars { ... }

Providing a custom _created_at attribute to all the instances of a class:

def object_birthday(c):
    def wrapper(*args, **kargs):
        # create the object
        o = c(*args, **kargs)

        # Inject a method right before returning it.
        o._created_at = time.time()

    return wrapper