codehaus


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How do I give a decorator acces to the class of a decorated function


Antoon Pardon wrote:

> What I am trying to do is the following.
> 
> class MyClass (...) :
>     @register
>     def MyFunction(...)
>         ...
> 
> What I would want is for the register decorator to somehow create/mutate
> class variable(s) of MyClass.
> 
> Is that possible or do I have to rethink my approach?

If you are willing to delegate the actual work to the metaclass call: 

def register(f):
    f.registered = True
    return f

def registered(name, bases, namespace):
    namespace["my_cool_functions"] = [
        n for n, v in namespace.items()
        if getattr(v, "registered", False)
    ]
    return type(name, bases, namespace)

class MyClass(metaclass=registered) :
    @register
    def foo(self):
        pass
    @register
    def bar(self):
        pass
    def other(self):
        pass

print(MyClass.my_cool_functions)