On Wed, Aug 31, 2011 at 11:12 AM, Prasad, Ramit
<[email protected]> 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