get importlib Does python have an equivalent to Java Class.forName()?
Assuming the class is in your scope:
globals()['classname'](args, to, constructor)
getattr(someModule, 'classname')(args, to, constructor)
Edit: Note, you can't give a name like 'foo.bar' to getattr. You'll need to split it by . and call getattr() on each piece left-to-right. This will handle that:
module, rest = 'foo.bar.baz'.split('.', 1) fooBar = reduce(lambda a, b: getattr(a, b), rest.split('.'), globals()[module]) someVar = fooBar(args, to, constructor)
I have the need to take a string argument and create an object of the class named in that string in Python. In Java, I would use
Class.forName().newInstance(). Is there an equivalent in Python?
Thanks for the responses. To answer those who want to know what I'm doing: I want to use a command line argument as the class name, and instantiate it. I'm actually programming in Jython and instantiating Java classes, hence the Java-ness of the question.
getattr() works great. Thanks much.
Yet another implementation.
def import_class(class_string): """Returns class object specified by a string. Args: class_string: The string representing a class. Raises: ValueError if module part of the class is not specified. """ module_name, _, class_name = class_string.rpartition('.') if module_name == '': raise ValueError('Class name must contain module part.') return getattr( __import__(module_name, globals(), locals(), [class_name], -1), class_name)
This is found in the python standard library, as unittest.TestLoader.loadTestsFromName. Unfortunately the method goes on to do additional test-related activities, but this first ha looks re-usable. I've edited it to remove the test-related functionality:
def get_object(name): """Retrieve a python object, given its dotted.name.""" parts = name.split('.') parts_copy = parts[:] while parts_copy: try: module = __import__('.'.join(parts_copy)) break except ImportError: del parts_copy[-1] if not parts_copy: raise parts = parts[1:] obj = module for part in parts: parent, obj = obj, getattr(obj, part) return obj