题
我想知道如何在 Python 中使用对象和函数名称的变量。在 PHP 中,您可以这样做:
$className = "MyClass";
$newObject = new $className();
你如何在 Python 中做这样的事情?或者,我完全不理解 Python 的一些根本区别吗?如果是,那是什么?
解决方案
在Python中,
className = MyClass
newObject = className()
第一行使变量 className
引用与 MyClass
相同的内容。然后下一行通过 className
变量调用 MyClass
构造函数。
作为一个具体的例子:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(在Python中, list
是 list
类的构造函数。)
不同之处在于,在PHP中,您表示要作为字符串引用的类的名称,而在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
后一种方法可能是最安全的方法,所以它可能是你应该尽可能使用的。
如果您需要在 Python 中创建动态类(即名称是变量的)您可以使用 type() ,它需要 3 个参数:名称、基础、属性
>>> 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
但是,要非常小心你在哪里获得你使用的字符串&quot; eval()&quot; on - 如果它来自用户,那么你实际上是在创造一个巨大的安全漏洞。
更新:使用 type()
,如coleifer的答案所示,远远优于此解决方案。
不隶属于 StackOverflow