On Fri, 01 May 2009 08:11:01 -0700, zealalot wrote: > On May 1, 10:50 am, CTO <debat...@gmail.com> wrote: >> Make doNothing a classmethod. >> >> class SomeClass: >> >> @classmethod >> def doNothing(cls): >> pass >> >> def function1(self): >> print "Running function 1" >> >> def function2(self, passedFunction=SomeClass.doNothing): >> print "Running passed function" >> passedFunction() >> >> someObject = SomeClass() >> someObject.function2() >> someObject.function2(someObject.function1) > > It's not surprising, but I've never heard of a classmethod before. > Basically, I read that it basically removes the need for the 'self' > argument. Very cool!
Not so. When you call an ordinary method (an "instance method"), Python automatically inserts the object itself as the first argument. So you need to define the method with one extra parameter, self. (Using the name self is just a convention. You can call it anything you like.) For classmethods, Python automatically inserts not the object itself, but the object's *class* as the first argument. So you still need to define the method with an extra parameter, only now the convention is to call is cls rather than self. Here's an example: class Test(object): x = 0 # class attribute def __init__(self, x): self.x = x # instance attribute def spam(self): print self, self.x @classmethod def ham(cls): print cls, cls.x And in use: >>> t = Test(42) >>> t.spam() <__main__.Test object at 0xb7cccc6c> 42 >>> t.ham() <class '__main__.Test'> 0 There is one other related built-in decorator, staticmethod(). staticmethod() tells Python not to pass any extra argument to the method. That means the inside a static method, you can't refer to either the instance (self) or the class! Needless to say, there aren't very many uses for staticmethod(). -- Steven -- http://mail.python.org/mailman/listinfo/python-list