How to learn OO of python?

could ildg could.net at gmail.com
Thu May 19 04:58:05 EDT 2005


Steven Bethard:
Thank you so much!
Your answer is very very helpful~

On 5/19/05, Steven Bethard <steven.bethard at gmail.com> wrote:
> could ildg wrote:
> > I think decorator is a function which return a function, is this right?
> > e.g. The decorator below if from http://www.python.org/peps/pep-0318.html#id1.
> >
> > def accepts(*types):
> >     def check_accepts(f):
> >         assert len(types) == f.func_code.co_argcount
> >         def new_f(*args, **kwds):
> >             for (a, t) in zip(args, types):
> >                 assert isinstance(a, t), \
> >                        "arg %r does not match %s" % (a,t)
> >             return f(*args, **kwds)
> >         new_f.func_name = f.func_name
> >         return new_f
> >     return check_accepts
> >
> > After I saw all the examples, I concluded that every decorator must
> > define an inner function which takes only one argument, the
> > function to decorate. Is this right?
> 
> It's close, but not quite right.  (I will use the word "function" for
> the moment, but see below for why this is inaccurate.)  Every
> *decorator* must take only one argument, the function to decorate. It is
> not at all necessary that a decorator define an inner function.
> Consider (from [1]):
> 
> def onexit(f):
>      import atexit
>      atexit.register(f)
>      return f
> 
> onexit is a decorator because it takes a function and returns a
> function.  In this case, it happens to be that the same function is
> accepted and returned.
> 
> Note that in the 'accepts' example above, *check_accepts* is the
> decorator, not accepts.  The accepts function is actually a function
> that *returns* decorators.
> 
> Now about that word "function".  Decorators are actually *callables*
> that accept a single *callable* and return a *callable*.  Why does the
> terminology matter?  Because I can construct decorators from classes too
> (from [2]):
> 
> class memoized(object):
>     def __init__(self, func):
>        self.func = func
>        self.cache = {}
>     def __call__(self, *args):
>        try:
>           return self.cache[args]
>        except KeyError:
>           self.cache[args] = value = self.func(*args)
>           return value
>        except TypeError:
>           return self.func(*args)
> 
> Now the memoized decorator can be used just like any other decorator, e.g.:
> 
> @memoized
> def fibonacci(n):
>     if n in (0, 1):
>        return n
>     return fibonacci(n-1) + fibonacci(n-2)
> 
> Note however that memoized is a *callable*, not a *function*.
> 
> STeVe
> 
> [1] http://www.python.org/peps/pep-0318.html
> [2] http://wiki.python.org/moin/PythonDecoratorLibrary
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list