On Class namespaces, calling methods

Patrick Maupin pmaupin at gmail.com
Sat Apr 10 11:59:45 EDT 2010


On Apr 10, 9:26 am, vsoler <vicente.so... at gmail.com> wrote:

> class Uno:
>     a=1
>     def m():
>         print "mouse"
>

...

> I cannot write
>       Uno.m()

By default (at least in Python 2.x), Python will pass any function
which is accessed through getattr on class or instance (usually called
a "method") an instance of the class as the first parameter.

You can avoid this by using the @staticmethod decorator in front:

class Uno:
    a = 1
    @staticmethod
    def m():
        print "mouse"

Then you can call Uno.m() directly.

This puts a "staticmethod" wrapper around m(), which explains to the
interpreter not to try to pass it the instance variable.

Also useful is @classmethod.

Interestingly, if you don't use staticmethod, the value in the class's
dictionary is an ordinary function, but if you do use staticmethod,
you no longer have a callable function in the class's dictionary:

>>> class fred:
...     def m():
...        print "foo"
...
>>> fred.__dict__['m']()
foo
>>> class fred:
...     @staticmethod
...     def m():
...        print "foo"
...
>>> fred.__dict__['m']()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'staticmethod' object is not callable


HTH,
Pat



Regards,
Pat



More information about the Python-list mailing list