使用Python eval来评估类

时间:2014-09-26 17:12:42

标签: python oop eval kivy

如何使用eval在其他类中创建类定义?

evalstr = str("class MyScreen(Screen):\n\tpass\n")
eval(evalstr)

我想在其他类方法中执行此代码。但它会返回错误。

3 个答案:

答案 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用于将任意代码字符串作为语句执行,这是您需要的。

但严重的是,在大多数情况下这是一个等待发生的安全灾难,请考虑替代方案(比如将代码编写为字符串)。

编辑: 切普纳的答案可能是正确的方法。