我想知道如何在Python中使用变量作为对象和函数名称。在PHP中,可以这样做:
$className = "MyClass";
$newObject = new $className();
在Python中如何做这种事情?或者说,我是否没有充分理解Python的一些基本差异,如果是的话,是什么?
我想知道如何在Python中使用变量作为对象和函数名称。在PHP中,可以这样做:
$className = "MyClass";
$newObject = new $className();
在Python中如何做这种事情?或者说,我是否没有充分理解Python的一些基本差异,如果是的话,是什么?
假设some_module有一个名为"class_name"的类:
import some_module
klass = getattr(some_module, "class_name")
some_object = klass()
我应该指出,在这里你需要小心:如果字符串来自用户,将字符串转换为代码可能是危险的,因此在这种情况下要牢记安全性。 :)
另一种方法(假设我们仍在使用“class_name”):
class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']() #call the object once we've pulled it out of the dict
classes = {'class1': Class1, 'class2': Class2,...}
。现在我可以使用 myob = classes['<class_name'].objects.get(id=<obj_id>)
获取对象。 - FurbeenatorclassName = MyClass
newObject = className()
第一行将变量className
指向与MyClass
相同的东西。然后,下一行通过className
变量调用MyClass
构造函数。
作为一个具体的例子:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(在Python中,list
是list
类的构造函数。)
区别在于,在PHP中,您将要引用的类的名称表示为字符串,而在Python中,您可以直接引用相同的类。 如果您必须使用字符串(例如如果类的名称是动态创建的),则需要使用其他技术。
>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})
<class '__main__.MyClass'>
>>> inst = klass()
>>> inst.msg
foobarbaz
class MyClass:
def __init__(self):
print "MyClass"
>>> x = MyClass()
MyClass
>>> a = "MyClass"
>>> y = eval(a)()
MyClass
但是,请非常小心地选择您使用 "eval()" 的字符串来源——如果它来自用户,则实际上会创建一个巨大的安全漏洞。
更新:如coleifer的答案中所示,使用type()
要比这个解决方案优秀得多。
newObject = globals()[className]()
我更喜欢使用字典来存储类与字符串之间的映射关系。
>>> class AB:
... def __init__(self, tt):
... print(tt, "from class AB")
...
>>> class BC:
... def __init__(self, tt):
... print(tt, "from class BC")
...
>>> x = { "ab": AB, "bc": BC}
>>> x
{'ab': <class '__main__.AB'>, 'bc': <class '__main__.BC'>}
>>>
>>> x['ab']('hello')
hello from class AB
<__main__.AB object at 0x10dd14b20>
>>> x['bc']('hello')
hello from class BC
<__main__.BC object at 0x10eb33dc0>