On Nov 27, 2007 3:12 AM, Steven D'Aprano <[EMAIL PROTECTED]> wrote: > There's some subtle behaviour going on here that I don't really follow. > Class methods apparently aren't classmethods. > > > >>> class Parrot(object): > ... def method(self, *args): > ... return self, args > ... @classmethod > ... def cmethod(cls, *args): > ... return cls, args > ... > >>> type(parrot.method) # as expected > <type 'instancemethod'> > >>> type(parrot.cmethod) # I don't expect this result > <type 'instancemethod'> > >>> type(classmethod(parrot.method)) > <type 'classmethod'> > >>> > >>> parrot.cm = classmethod(parrot.method) > >>> type(parrot.cm) # I expect this > <type 'classmethod'> > >>> > >>> Parrot.CM = classmethod(parrot.method) > >>> type(Parrot.CM) # but not this > <type 'instancemethod'> > > > Can anyone explain why class methods bound to a class are instancemethods > rather than classmethods? > >
They're instancemethods bound to the type instance, rather than to an instance of the type: >>> c = C() >>> c.method <bound method C.method of <__main__.C object at 0x01B8F330>> >>> c.cmethod <bound method type.cmethod of <class '__main__.C'>> >>> So rather than inventing special machinery for classmethods, Python uses the existing instancemethod machinery and just changes the object the instancemethod is bound to. -- http://mail.python.org/mailman/listinfo/python-list