On Wed, Aug 31, 2011 at 11:12 AM, Prasad, Ramit
<ramit.pra...@jpmorgan.com> wrote:
> It seems to me that if I add a function to the list of class attributes it 
> will automatically wrap with "self" but adding it to the object directly will 
> not wrap the function as a method. Can somebody explain why? I would have 
> thought that any function added to an object would be a method (unless 
> decorated as a class method).

Because things stored on the class are generally viewed as part of the
class definition, whereas things stored on an instance are generally
viewed as data -- a function stored on an object instance is usually
just meant to be a function.  Consider the following code:

class Sorter(object):
    def __init__(self, keyfunc):
        self.keyfunc = keyfunc
    def sort(self, item_list):
        item_list.sort(key=self.keyfunc)

sorter = Sorter(lambda x: x.id)
sorter.sort(some_list_of_items)

If adding keyfunc as an attribute to the object wrapped it up as a
method, it would break, since the function is not expecting a "self"
argument.

More technically, because descriptors are only invoked when they're
stored on the class.

> Hmm, or does the decoration just tell Python not to turn an object's function 
> into a method? I.e. Is the decorator basically just the syntactic sugar for 
> doing the above?

If you mean the staticmethod decorator, yes, it pretty much just wraps
the function as a "staticmethod" instance to prevent it from being
wrapped into an ordinary method when it's accessed.

Cheers,
Ian
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to