karsep5
karsep5

Reputation: 72

Does python consider any method without cls or self arguments implicitly as static?

The following are test classes with methods not taking in cls or self arguments and dont have @staticmethod decorator. They work like normal static methods without complaining about arguments. This seems contrary to my understanding of python methods. Does python automatically treat non-class, non-instance methods as static?

>>> class Test():
... def testme(s):
...  print(s)
...
>>> Test.testme('hello')
hello

>>> class Test():
...  def testme():
...   print('no')
...
>>> Test.testme()
no

P.S: I am using python3.4

Upvotes: 1

Views: 402

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599610

Note that this doesn't work in Python 2:

>>> class Test(object):
...     def testme():
...         print 'no'
...
>>> Test.testme()
Traceback (most recent call last):
  File "<ipython-input-74-09d78063da08>", line 1, in <module>
    Test.testme()
TypeError: unbound method testme() must be called with Test instance as first argument (got nothing instead)

But in Python 3, unbound methods were removed, as Alex Martelli points out in this answer. So really all you're doing is calling a plain function that happens to be defined inside the Test class.

Upvotes: 2

jonrsharpe
jonrsharpe

Reputation: 122032

It sort of does, yes. However, note that if you call such an "implicit static method" on an instance, you will get an error:

>>> Test().testme()
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    Test().testme()
TypeError: testme() takes 0 positional arguments but 1 was given

This is because the self parameter still gets passed, which doesn't happen with a proper @staticmethod:

>>> class Test:
    @staticmethod
    def testme():
        print('no')


>>> Test.testme()
no
>>> Test().testme()
no

Upvotes: 3

Related Questions