Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does the @staticmethod decorator do anything?

I made these two classes:

class A:
    @staticmethod
    def f(x):
        print("x is", x)

class B:
    def f(x):
        print("x is", x)

And used them like this:

>>> A.f(1)
x is 1
>>> B.f(1)
x is 1

It looks like f became a static method on B even without the decorator. Why would I need the decorator?

like image 875
davidvgalbraith Avatar asked Mar 09 '19 19:03

davidvgalbraith


People also ask

What is the use of static method decorator?

The static method decorator or @staticmethod is used to define methods inside a class as static methods. For example: class CodesCracker: @staticmethod def statfun (x): print ( "Value of x:", x) CodesCracker.statfun ( "Hey!") Value of x: Hey! Note - Static methods do not have access to what the class is.

What is the use of @staticmethod in Java?

The @staticmethod is a built in function and simply returns a static method. These static methods are similar to any other class methods and are bound to a class. These staticmethod does not require class instance creation, that is why they are not dependent on a state of object.

What are the disadvantages of a static method?

It can’t access or modify class state. It is present in a class because it makes sense for the method to be present in class. A static method does not receive an implicit first argument. Syntax: class C (object): @staticmethod def fun (arg1, arg2, ...): ...

Why is a static method present in a class?

It is present in a class because it makes sense for the method to be present in class. A static method does not receive an implicit first argument. Syntax: class C (object): @staticmethod def fun (arg1, arg2, ...): ... Returns: a static method for function fun.


Video Answer


2 Answers

It used to matter more back in Python 2, where the instance-ness of instance methods was enforced more strongly:

>>> class B:
...     def f(x):
...         print("x is", x)
...
>>> B.f(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with B instance as first argument (
got int instance instead)

You had to mark static methods with @staticmethod back then.

These days, @staticmethod still makes it clearer that the method is static, which helps with code readability and documentation generation, and it lets you call the method on instances without the system trying to bind self.

like image 55
user2357112 supports Monica Avatar answered Oct 16 '22 07:10

user2357112 supports Monica


Try these two classes, both having a cry method, one as a classmethod and another as a staticmethod with self passed on

class Cat:

    def __init__(self):
        self.sound = "meow"

    def cry(self):
        print(self.sound)

x = Cat()
x.cry()
meow

and with another class

class Dog:
    def __init__(self):
        self.sound = "ruff-ruff"

    @staticmethod
    def cry(self):
        print(self.sound)

x = Dog()
x.cry()
TypeError: cry() missing 1 required positional argument: 'self'

and we can see the @staticmethod decorator basically removed the passed in self

like image 2
All Іѕ Vаиітy Avatar answered Oct 16 '22 06:10

All Іѕ Vаиітy