Reasoning of calling a method on class object instead of class instance object

Ben Finney ben+python at benfinney.id.au
Mon Mar 18 19:55:08 EDT 2019


Arup Rakshit <ar at zeit.io> writes:

> class RefrigeratedShippingContainer(ShippingContainer):
>     # ...
>
>     @staticmethod
>     def _c_to_f(celsius):
>         return celsius * 9/5 + 32
>
>     @staticmethod
>     def _f_to_c(fahrenheit):
>         return (fahrenheit - 32) * 5/9

Both those functions are decorated with ‘staticmethod’. That means
<URL:https://docs.python.org/3/library/functions.html#staticmethod>
that the function will, unlike typical methods, not automatically
receive any implicit first argument. That's why the function signature
has no ‘self’ or ‘klass’ or the like.

> If I call `_c_to_f`, `_f_to_c` methods on `self` instead of
> `RefrigeratedShippingContainer` class object, still it works.

That's right, and is indeed the point of making a static method on a
class. From the above documentation link:

    [A staticmethod-decorated function] can be called either on the
    class (such as `C.f()`) or on an instance (such as `C().f()`). The
    instance is ignored except for its class.

> So what is the reason behind of this calling on the class object,
> instead class instance object?

Whichever makes the most sense in the code where that function is
called.

The purpose of a static method is to imply that, though the function
*could* be entirely separate from any class, it is conceptually part of
a spacific class's behaviour.

In the specific example you show, I expect the code maintenance was
deemed to be easier when the RefrigeratedShippingContainer encapsulates
the conversions of temperature units.

-- 
 \         “When we pray to God we must be seeking nothing — nothing.” |
  `\                                                —Francis of Assisi |
_o__)                                                                  |
Ben Finney




More information about the Python-list mailing list