I am curious about why we need the @staticmethod decorator to declare method as static.
I was reading about static methods in Python, and I came to know that a static method can be callable without instantiating its class.
So I tried the two examples below, but both do the same:
class StatMethod:
def stat():
print("without Decorator")
class StatMethod_with_decorator:
@staticmethod
def stat():
print("With Decorator")
If I call the stat() method on the class directly, both print/show the values below:
>> StatMethod.stat()
without Decorator
>> StatMethod_with_decorator.stat()
With Decorator
-
1Now try it with a function that takes some arguments...PM 2Ring– PM 2Ring2017年04月24日 11:43:15 +00:00Commented Apr 24, 2017 at 11:43
-
2This might help: stackoverflow.com/questions/136097/…Kendas– Kendas2017年04月24日 11:44:28 +00:00Commented Apr 24, 2017 at 11:44
-
2Note that I've found out with some tests that Python 2.7 requires using the decorator when the function has an arg, whereas Python 3 does not. Python 2.7 tries to match the first arg to the instance (it thinks it's self), whereas Python 3 seems to understand that one arg is just the function's arg, without having to use the annotation for that. I haven't found anything about this specific difference in the docs.JRobinss– JRobinss2018年12月05日 15:41:52 +00:00Commented Dec 5, 2018 at 15:41
5 Answers 5
You need the decorator if you intend to try to call the @staticmethod from the instance of the class instead of of the class directly
class Foo():
def bar(x):
return x + 5
>>> f = Foo()
>>> f.bar(4)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
f.bar(4)
TypeError: bar() takes 1 positional argument but 2 were given
Now if I declare @staticmethod the self argument isn't passed implicitly as the first argument
class Foo():
@staticmethod
def bar(x):
return x + 5
>>> f = Foo()
>>> f.bar(4)
9
7 Comments
The documentation describes some transformations that are done when calling a user defined method:
Note that the transformation from function object to (unbound or bound) method object happens each time the attribute is retrieved from the class or instance. In some cases, a fruitful optimization is to assign the attribute to a local variable and call that local variable. Also notice that this transformation only happens for user-defined functions; other callable objects (and all non-callable objects) are retrieved without transformation. It is also important to note that user-defined functions which are attributes of a class instance are not converted to bound methods; this only happens when the function is an attribute of the class.
For methods marked as staticmethod this is different:
Static method objects provide a way of defeating the transformation of function objects to method objects described above. A static method object is a wrapper around any other object, usually a user-defined method object. When a static method object is retrieved from a class or a class instance, the object actually returned is the wrapped object, which is not subject to any further transformation. Static method objects are not themselves callable, although the objects they wrap usually are. Static method objects are created by the built-in staticmethod() constructor.
Comments
if function has some parameters, then call non static method would be failed
and static method didn't use the local variables in the class, but the class method will be
1 Comment
Update: In python 3.10 you dont need the decorator any more
1 Comment
class test(): def func(arg1, arg2): print('func') print(test.func(5, 'arg2')) s = test() print(s.func(5, 'arg2'))Just my simple approach here. Forget the decorators. Use the class directly (Python 3.8):
class MyClass:
def myMethod(self, myValue):
print(myValue)
MyClass.myMethod(None, "hi")
Or both:
MyClass.myMethod(None, "hi from class")
myInstance = myClass()
myInstance.myMethod2("hi from instance")
1 Comment
self but not using it falls into that category. It would therefore be canonical to make that method static.