67

I have a class

class Foo():
    def some_method():
        pass

And another class in the same module:

class Bar():
    def some_other_method():
        class_name = "Foo"
        # Can I access the class Foo above using the string "Foo"?

I want to be able to access the Foo class using the string "Foo".

I can do this if I'm in another module by using:

from project import foo_module
foo_class = getattr(foo_module, "Foo")

Can I do the same sort of thing in the same module?

The guys in IRC suggested I use a mapping dict that maps string class names to the classes, but I don't want to do that if there's an easier way.

martineau
  • 112,593
  • 23
  • 157
  • 280
Chris McKinnel
  • 14,050
  • 6
  • 62
  • 67

3 Answers3

99
import sys
getattr(sys.modules[__name__], "Foo")

# or 

globals()['Foo']
khachik
  • 27,152
  • 7
  • 54
  • 92
9

You can do it with help of the sys module:

import sys

def str2Class(str):
    return getattr(sys.modules[__name__], str)
Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
jh314
  • 25,902
  • 15
  • 60
  • 80
6
globals()[class_name]

Note that if this isn't strictly necessary, you may want to refactor your code to not use it.

user2357112
  • 235,058
  • 25
  • 372
  • 444