What is a class method?

Denis Gomes denisg640 at gmail.com
Mon Aug 23 12:31:11 EDT 2010


John,

   I agree with you and I also think the definition given on the official
python site is somewhat confusing, at least for an engineer like myself.
But I'll take a stab at explaning it using what I know thus far.

  I think to understand what a class method is you have to first understand
what a class variable is.  Take this code snippet for example.

class foo(object):
     x=10
     def __init__(self):
          self.x=20

In this example if you create an instance of foo and call it f.  You can
access the instance attribute x by using f.x or you can access the class
variable using the notation foo.x.  These two will give you two different
results.  Now lets do something a bit more interesting.
Say you have the following snippet.

class foo(object):
     x=0
     def __init__(self):
          self.x=10
          foo.x+=1

>>>f=foo()
>>>g=goo()
>>>f.x
10
>>>g.x
10
>>>foo.x
2

What happened here is that the class variable foo.x is used to keep a count
of the total number of instances created.  So we see that a class variable
can be looked at as what "connects" the two instances in a way, so that data
can be shared between instances of the same class.  This defintion may very
well only apply to this case, but I think the mechanics is fundamentally the
same.
Keeping this in mind, lets make the jump to class methods.  When an
instance of a class is created, the methods are just functions that "work
on" the attributes (the variables).  Similarly, a class method is a method
that works on a class variable.  For example,

class foo(object):
     x=10
     def __init__(self):
          self.x=20
     @classmethod
     def change(self):
           self.x=15

>>>f=foo()
>>>f.x
20
>>>foo.x
10
>>>f.change()
>>>f.x
20
>>>foo.x
15

So this is my explanation for what a classmethod is.  Hope it helps.  Good
luck.

Denis

On Mon, Aug 23, 2010 at 2:24 AM, John Nagle <nagle at animats.com> wrote:

> On 8/22/2010 9:16 PM, James Mills wrote:
>
>> On Mon, Aug 23, 2010 at 1:53 PM, Paulo da Silva
>>
>> <psdasilva.nospam at netcabonospam.pt>  wrote:
>>
>>> I did it before posting ...
>>>
>>> The "explanation" is not very clear. It is more like "how to use it".
>>>
>>
>> Without going into the semantics of languages basically the
>> differences are quite clear:
>>
>> @classmethod is a decorator that warps a function with
>> passes the class as it's first argument.
>>
>> @staticmethod (much like C++/Java) is also a decorator that
>> wraps a function but does not pass a class or instance as
>> it's first argument.
>>
>
>    That reads like something the C++ standards revision committee
> would dream up as they add unnecessary template gimmicks to the
> language.
>
>                                John Nagle
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100823/a987962d/attachment-0001.html>


More information about the Python-list mailing list