在Python中使用变量作为类名?
我想知道在Python中如何使用变量来表示对象和函数的名字。在PHP中,你可以这样做:
$className = "MyClass";
$newObject = new $className();
那么在Python中要怎么做呢?或者说,我是不是完全没理解Python的一些基本区别,如果是的话,那到底是什么呢?
6 个回答
25
如果你想在Python中创建一个动态类(也就是说,这个类的名字是一个变量),你可以使用type()这个函数,它需要三个参数:名字、基类和属性。
>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})
<class '__main__.MyClass'>
>>> inst = klass()
>>> inst.msg
foobarbaz
- 不过要注意,这个方法并不会“实例化”这个对象(也就是不会调用构造函数等)。它只是创建了一个新的(!)同名类。
68
假设某个模块里有一个叫“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
后一种方法可能是最安全的做法,所以如果有可能的话,最好使用这种方法。
30
在Python中,
className = MyClass
newObject = className()
第一行让变量 className
指向和 MyClass
一样的东西。接下来的一行通过 className
变量来调用 MyClass
的构造函数。
举个具体的例子:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(在Python中,list
是 list
类的构造函数。)
不同的是,在PHP中,你需要用字符串来表示你想要引用的类名,而在Python中,你可以直接引用同一个类。如果你必须使用字符串(比如类名是动态生成的),那么你就需要用其他的方法来处理。