if (something):
classToUse = C1
else:
classToUse = C2
o = classToUse()
,but this is not what I want. I need to have the class name in the string and then
instantiate it:
(this does not work of course)
classToUse = "C1"
o = classToUse()
It is because I don`t know at the moment what the name of the class will be, I will
load it from the file or pass it as argument. Does anyone know what is the correct syntax
to accomplish this?
Thanks for your time in advance
Jan Mach
You can always do eval(my_string) to get the class object.
Better I think is to make an explicit dictionary of options (much
safer).
classes = dict((cls.__name__, cls) for cls in (C1, C2))
classes["C1"] # gives you C1
classes["C2"] # gives you C2
Richard.
> I need to have the class name in the
> string and then instantiate it:
>
> (this does not work of course)
> classToUse = "C1"
> o = classToUse()
>
> It is because I don`t know at the moment what the name of the class will
> be, I will load it from the file or pass it as argument. Does anyone
> know what is the correct syntax to accomplish this?
Here are three solutions:
# 1
classToUse = globals()['C1']
# 2
thisModule = __import__(__name__)
classToUse = thisModule.__dict__['C1']
# 3
classToUse = eval('C1')
The first solution is probably the best; the third is tempting, but
dangerous if you can't absolutely trust the source of the string 'C1'.
(Google "code injection" for more details on why eval is risky.)
--
Steven
Make a dict of name->class, otherwise it's a security issue. A malicious
user may pass a class you never wish to instantiate (with eval, it's
even worse, malicious user can execute arbitrary code).
Any reason to prefer this over:
classToUse = getattr(thisModule, 'C1')
? (I think, for a module, they should do exactly the same thing.
Personally, I prefer keeping explicit references to __special
names__ to a minimum.)
--
\S
under construction
No, no reason at all. I just forgot about getttr.
--
Steven