2012-02-10 79 views
8

我正在使用接受类作为输入的ORM,我需要能够为它提供一些动态生成的类。目前,我做这样的人为的例子:在运行时创建Python类的最坏方法是什么?

def make_cls(_param): 
    def Cls(object): 
     param = _param 
    return Cls 

A, B = map(make_cls, ['A', 'B']) 

print A().foo 
print B().foo 

虽然这工作得很好,它的有点感觉关:例如,两个类打印为<class '__main__.Cls'>在REPL。虽然名称问题不是什么大问题(我想我可以通过设置__name__来解决它),但我不知道是否还有其他事情我不知道。 所以我的问题是:是否有更好的方式来动态创建类,或者我的例子大多已经罚款了吗?

+0

http://stackoverflow.com/questions/4513192/python-dynamic-class-names – Cez 2012-02-10 20:56:25

+3

可能的副本如下面的罗马笔记,您将希望使用'type'来动态创建类。 [这个问题]的最佳答案(http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python)非常详细地介绍了这一点。 – aganders3 2012-02-10 20:57:46

+0

“一个ORM”?哪个ORM? ORM为你做了很多这样的事情。 – 2012-02-10 21:24:07

回答

10

什么是班级?这只是type的一个实例。例如:

>>> A = type('A', (object,), {'s': 'i am a member', 'double_s': lambda self: self.s * 2}) 
>>> a = A() 
>>> a 
<__main__.A object at 0x01229F50> 
>>> a.s 
'i am a member' 
>>> a.double_s() 
'i am a memberi am a member' 

doc

类型(名称,碱,字典)

返回一个新类型的对象。这实质上是类声明的一种动态形式。

+0

由于type只接收这3个参数,我可以安全地假设这个名字真的是唯一出错或者是使用'type'还有其他好处吗? – hugomg 2012-02-10 21:00:02

+1

将其封装到一个带有关键字参数的函数中是一种很好的方法,因此您可以在函数调用中轻松指定新类的属性。 – kindall 2012-02-10 21:03:19

+0

@missingno那么,在创建一些复杂的类的时候,你的方法会很有用(例如,添加'classmethod'和'type'的用法会很难看),但是如果你需要在运行时构建一些复杂的东西,糟糕的事情发生在你的架构:)'类型'只是这种事情的推荐解决方案。 – 2012-02-10 21:08:53

相关问题