25

I want to access a static variable from a static method:

#!/usr/bin/env python
class Messenger:
    name = "world"
    @staticmethod
    def get_msg(grrrr):
        return "hello " + grrrr.name

print Messenger.get_msg(Messenger)

How to do it without passing grrrr to a method? Is this the true OOP?..

Anything like name or self.name seems not working:

NameError: global name 'name' is not defined

and

NameError: global name 'self' is not defined
Dmitry Isaev
  • 3,888
  • 2
  • 37
  • 49

2 Answers2

31

Use @classmethod instead of @staticmethod. Found it just after writing the question.

In many languages (C++, Java etc.) "static" and "class" methods are synonyms. Not in Python.

Community
  • 1
  • 1
Dmitry Isaev
  • 3,888
  • 2
  • 37
  • 49
16
def get_msg():
    return "hello " + Messenger.name

You can't use self.name because self is not defined. self is a naming convention for the first parameter of non-static or non-classmethod methods. It points to the object on which you called the method. Since your method is static, you don't need an object to call it on.

Ioan Alexandru Cucu
  • 11,981
  • 6
  • 37
  • 39
  • So to access a static variable within a static method of the class, I have to prefix the class name to the static variable I am accessing, like you have shown in your answer? – DaCruzR Oct 19 '20 at 19:09
  • @RaynerDaCruz if you access it in a @staticmethod, then yes, you need to prefix the class name. If it's a @classmethod, then you can also use the `cls` argument of your method. Difference is well described here: https://medium.com/school-of-code/classmethod-vs-staticmethod-in-python-8fe63efb1797 – Ioan Alexandru Cucu Oct 20 '20 at 20:31