如何使用eval在其他类中创建类定义?
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
我想在其他类方法中执行此代码。但它会返回错误。
答案 0 :(得分:4)
改为使用type
功能:
MyScreen = type("MyScreen", (Screen,), {})
这是在运行时创建类的正确方法(实际上基本上是执行class
语句的方法,因为type
也是Python中的默认元类)。
您也可以简单地将该类定义为“正常”方式;没有任何内容表明class
语句必须位于模块的全局级别:
class Something(object):
# Define a new class here...
class MyScreen(Screen):
pass
def __init__(self):
"""Initialize a Something object"""
# ... or here
class MyScreen(Screen):
pass
答案 1 :(得分:1)
您不能使用eval
因为class
是一个语句,而eval
只评估表达式而不是语句。您可以使用exec
。
答案 2 :(得分:1)
您希望此处exec
不是eval
(除了安全问题)
evalstr = str("class MyScreen(Screen):\n\tpass\n")
exec(evalstr)
eval
只会评估一个表达式并返回它的值。 exec
用于将任意代码字符串作为语句执行,这是您需要的。
但严重的是,在大多数情况下这是一个等待发生的安全灾难,请考虑替代方案(比如将代码编写为字符串)。
编辑: 切普纳的答案可能是正确的方法。