45

我想知道如何在 Python 中为对象和函数名使用变量。在 PHP 中,您可以这样做:

$className = "MyClass";

$newObject = new $className();

你如何在 Python 中做这种事情?或者,我是否完全不了解与 Python 的一些根本区别,如果是,那是什么?

4

5 回答 5

64

假设 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

后一种方法可能是最安全的方法,因此如果可能的话,它可能是您应该使用的方法。

于 2008-10-21T21:33:05.263 回答
30

在 Python 中,

className = MyClass
newObject = className()

第一行使变量className引用与 相同的东西MyClass。然后下一行通过变量调用MyClass构造函数。className

作为一个具体的例子:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(在 Python 中,listlist类的构造函数。)

不同之处在于,在 PHP 中,您将要引用的类的名称表示为字符串,而在 Python 中,您可以直接引用同一个类。如果您必须使用字符串(例如,如果类的名称是动态创建的),那么您将需要使用其他技术。

于 2008-10-21T21:26:09.333 回答
25

如果您需要在 Python 中创建一个动态类(即名称为变量的类),您可以使用 type(),它需要 3 个参数:名称、基数、属性

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • 但是请注意,这不会“实例化”对象(即不调用构造函数等。它会创建一个具有相同名称的 new(!) 类。
于 2010-05-20T15:14:38.470 回答
8

如果你有这个:

class MyClass:
    def __init__(self):
        print "MyClass"

然后你通常会这样做:

>>> x = MyClass()
MyClass

但你也可以这样做,这就是我认为你要问的:

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

但是,要非常小心你从哪里得到你使用“eval()”的字符串——如果它来自用户,你实际上是在创造一个巨大的安全漏洞。

更新:使用type()如 coleifer 的答案所示远远优于此解决方案。

于 2008-10-21T21:32:34.017 回答
1

我用:

newObject = globals()[className]()
于 2020-01-24T16:39:14.773 回答