如何使用eval在其他类中创建类定义?使用Python eval评估类
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
我想在其他类方法中执行此代码。但它返回一个错误。
如何使用eval在其他类中创建类定义?使用Python eval评估类
evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)
我想在其他类方法中执行此代码。但它返回一个错误。
你想exec
不eval
这里(的安全问题除外)
evalstr = str("class MyScreen(Screen):\n\tpass\n")
exec(evalstr)
eval
将只计算表达式,并返回它的值。 exec
用于执行任意代码字符串作为语句,这是您在此处需要的。
但严重的是,这是一个等待大多数情况下发生的安全灾难,考虑替代方案(如将代码编写为字符串)。编辑: Chepner的答案可能是正确的选择。
当然,很容易滥用'exec',在大多数情况下(比如这个),有更好的方法来达到预期的结果。但是如果你可以保证**它的参数是[sane](http://xkcd.com/327/),那么使用'exec'不应该是一个安全问题。或者是?当然,大多数随便使用'exec'的人不会(或不能)确保他们正在执行的代码被正确清理...... – 2014-09-26 20:13:19
@ PM2Ring在此使用'exec'或'eval'案例告诉我,字符串在运行时间之前不会被知道。然而,仔细看看这个问题,似乎OP没有意识到你可以嵌套类。你说得对,如果代码被消毒了,那当然是安全的。 – 2014-09-27 19:18:39
我同意这种情况表明字符串在运行时间之前不会被知道。我想我们都同意,首先避免使用'exec'或'eval'通常比正确清理这些字符串更容易,尤其是在很大程度上依赖于用户输入的情况下。我只是提到,虽然使用'exec'或'eval'可能会有风险,但它们并不具有内在风险。 – 2014-09-27 19:41:26
您不能使用eval
,因为class
是一个语句,而eval
仅评估表达式,而不是语句。您可以使用exec
。
使用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
请更新你所得到的错误并产生错误(即上面的代码的上下文中)的代码的问题。 – isedev 2014-09-26 17:13:31
如果这是问题的核心,那么可以使用'type'动态创建类型。 – matsjoyce 2014-09-26 17:17:51
你为什么要这样做? – jonrsharpe 2014-09-26 17:18:03