82

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.

2
  • 2
    and yes, using a mapping dict is probably the proper way to go... Commented Jul 31, 2013 at 1:18
  • 1
    Thanks. I ended up refactoring 'cause I didn't want to use globals or use a mapping dict. Commented Jul 31, 2013 at 2:00

3 Answers 3

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

# or 

globals()['Foo']
Sign up to request clarification or add additional context in comments.

2 Comments

Accepted this answer 'cause it covers both sys and globals methods.
I know this is an old answer, but while a good answer it could be further improved by mentioning the pros/cons of the two options and which option is considered more pythonic.
12

You can do it with help of the sys module:

import sys

def str2Class(str):
    return getattr(sys.modules[__name__], str)

Comments

9
globals()[class_name]

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.