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?
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.
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.
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, ...): ...
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.
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
.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With