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