我想接受一个参数并创建一个名为参数本身的类。 例如,我将'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)
我收到了一个语法错误。请帮忙。
答案 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
答案可能更受欢迎。