在python中使用eval动态创建类

时间:2013-01-09 18:27:39

标签: python oop metaprogramming

我想接受一个参数并创建一个名为参数本身的类。 例如,我将'Int'作为参数并创建一个名为'Int'的类, 我的班级就是这样。

class Int :
    def __init__(self,param) :
        self.value = 3

我这样做是为了做到这一点。

def makeClass( x ) :

    return eval( 'class %s :\n    def __init__(self,param) :\n        self.type = 3'%(x,))

然后调用

myClass = makeClass('Int')
myInt = myClass(3)

我收到了一个语法错误。请帮忙。

2 个答案:

答案 0 :(得分:4)

eval用于评估表达式,class不是表达式,它是一个声明。也许你想要像exec

这样的东西

作为旁注,您可以使用type轻松完成此处的操作,然后您回避使用eval / {{1}的所有性能和安全隐患}。

exec

答案 1 :(得分:1)

根据要求,这适用于Python 2.7和Python 3.4,打印3

def makeClass(x):
    exec('class %s:\n\tdef __init__(self,v):\n\t\tself.value = v' % x)
    return eval('%s' % x)

myClass = makeClass('Int')
myInt = myClass(3)

print(myInt.value)

如果您希望添加现有类中的方法:

def makeClass(name):
    parent = name.lower()
    exec('class %s(%s):\n\tdef __init__(self,v):\n\t\tself.value = v' % (name, parent))
    return eval('%s' % name)

Int = makeClass('Int')
myInt = Int(3)

Str = makeClass('Str')
myStr = Str(3)

print(myInt.value, myInt == 3, myInt == 5)
print(myStr.value, myStr == '3', myStr == 3)

输出:

3 True False
3 True False

减少副作用的输入:

def makeClass(name):
    parent = name.lower()
    exec('global %s\nclass %s(%s):\n\tdef __init__(self,v):\n\t\tself.value = v' % (name, name, parent))

makeClass('Int')
myInt = Int(3)

makeClass('Str')
myStr = Str(3)
不过,

Mgilson的type答案可能更受欢迎。