当前位置:  开发笔记 > 编程语言 > 正文

在Python中使用变量用于类名?

如何解决《在Python中使用变量用于类名?》经验,为你挑选了4个好方法。

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

$className = "MyClass";

$newObject = new $className();

你是如何用Python做这种事的?或者,我完全不理解与Python的一些根本区别,如果是这样,它是什么?



1> Jason Baker..:

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

后一种方法可能是最安全的方法,所以它可能是你应该尽可能使用的.



2> Greg Hewgill..:

在Python中,

className = MyClass
newObject = className()

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

作为一个具体的例子:

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

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

区别在于,在PHP中,您表示要作为字符串引用的类的名称,而在Python中,您可以直接引用同一个类.如果必须使用字符串(例如,如果动态创建类的名称),则需要使用其他技术.


downvoted,因为您的解决方案与问题中的解决方案不匹配.他正在寻找的是用字符串实例化一个类.

3> coleifer..:

如果你需要在Python中创建一个动态类(即名称为变量的类),你可以使用type(),它需要3个参数:name,bases,attrs

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



>>> inst = klass()
>>> inst.msg
foobarbaz

但请注意,这不会"实例化"对象(即不调用构造函数等.它会创建一个具有相同名称的新(!)类.



4> TimB..:

如果你有这个:

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

然后你通常这样做:

>>> x = MyClass()
MyClass

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

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

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

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


天哪,不!评估功能是邪恶的.不要使用它.
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有