[Tutor] Decorators, I am confused.

Kent Johnson kent37 at tds.net
Fri Jul 15 05:17:39 CEST 2005

David Driver wrote:
> What I would like to do is something like this:
> class testObj(object):
>     _rules = list()
>     def evalRules(self):
>         for r in _rules:
>             r()
>     def rule(func):
>         if not func in func.__class__._rules:
>             func.__class__._rules.append(func)
>             print testis._rules
>         return func
>     @rule
>     def arule(self):
>         print a
> Of course it doesn't work. Is there a way to make it work? What I am
> trying to do is make a collection of validation rules that can be
> iterated and capture raised exceptions to be returned at the end of
> eval rules.

Here is one way to do it. The rule() decorator just adds an attribute to the function that marks it as a rule. You could also use a naming convention to mark rules. The __init__ method uses inspection of dir(self) to find the rules. Because dir() includes base class attributes it works with inherited rule classes which IIRC was something you wanted.

def rule(func):
    func.isRule = True
    return func

class testObj(object):
    def __init__(self):
        self._rules = []
        for name in dir(self):
            item = getattr(self, name)
            if getattr(item, 'isRule', False):
    def evalRules(self):
        for r in self._rules:

    def arule(self):
        print 'This is a rule'
    def brule(self):
        print 'This is another rule'

t = testObj()

class testObj2(testObj):
    def arule(self):
        print 'This is a new version of arule'

t = testObj2()

More information about the Tutor mailing list