4

我想接受一个参数并创建一个名称就是参数本身的类。例如,我将“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)

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

4

2 回答 2

6

eval用于评估表达式,class不是表达式,而是语句。也许你想要类似的东西exec

作为旁注,您在这里所做的事情可能很容易使用 完成type,然后您回避使用eval/的所有性能和安全影响exec

def cls_init(self,param):
    self.type = 3

Int = type("Int",(object,),{'__init__':cls_init})
#           ^class name
#                ^class bases -- inherit from object.  It's a good idea :-)
#                           ^class dictionary.  This is where you add methods or class attributes.
于 2013-01-09T18:28:40.557 回答
5

根据要求,这适用于 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答案可能是首选。

于 2015-06-10T08:46:52.553 回答