从值列表动态生成类

时间:2011-08-04 11:13:57

标签: python class dynamic

说我有一个像这样的词典列表:

[
    dict(name='Person', title='Person class'), 
    dict(name='Employee', title='Employee class') 
]

我想创建课程;一个名为Person,其属性标题设置为'Person class',另一个名为Employee,标题设置为'Employee class'。类的名称可以是任何名称,但类的属性名称是已知的,在本例中为title。

我想要最终得到的是动态创建的类的新列表;

classes = [Person, Employee]

好像手动定义了类:

class Person:
    title = 'Person class'

可以像这样实例化:

>>> x = classes[0]()
>>> print x.title
"Person class"

好像这还不够糟糕,我想将一个不同类中定义的方法分配给动态创建的类:

class X:
    def sum(self, a, b):
        print self
        return a+b

>>> x = X()
>>> x.sum(1,2)
__main__.x
3

>>> classes[0].sum = X.sum
>>> classes[0].sum(1,2)
__main__.Person
3

我知道上面的内容不起作用 - 也许它甚至没有意义。但是可以通过shomehow来完成 - 将类中定义的方法分配给不同的类吗?

3 个答案:

答案 0 :(得分:1)

您可以使用type功能:

>>> d = [
...     dict(name='Person', title='Person class'), 
...     dict(name='Employee', title='Employee class') 
... ]
>>> t = [type(i["name"], (object,), i) for i in d]
>>> t
[<class '__main__.Person'>, <class '__main__.Employee'>]
>>> t[0].title
'Person class'
>>> t[1].title
'Employee class'

答案 1 :(得分:1)

使用内置函数type()

>>> d
[{'name': 'Person', 'title': 'Person class'}, {'name': 'Employee', 'title': 'Employee class'}]
>>> types = [type(x['name'], (object,), {'title': x['title']}) for x in d]
>>> types[0]()
<__main__.Person object at 0x800f5fad0>
>>> types[0]().title
'Person class'

第二个问题的修改:

>>> class X(object):
...     def sum(self, a, b):
...         print self
...         return a+b
...
>>> types = [type(x['name'], (object,), {'title': x['title'], 'sum': X.__dict__['sum']}) for x in d]
>>> types[0]().sum(1,2)
<__main__.Person object at 0x800f5fad0>
3

请注意,为什么X.__dict__['sum']而非X.sumX.sum会返回<unbound method X.sum> - “知道”它属于X类的函数。在类中定义的原始函数sum位于X.__dict__。您可以在Unifying types and classes中阅读更多内容。

但是,请确保你需要这个,并且你完全理解这里做了什么。

答案 2 :(得分:0)

Python中有一个很棒的type()函数,它可以返回一个变量类型,也可以创建一个新类型,例如:

Person = type('Person', (object, ), { 'name' : 'Alex', 
                                      'last_name' : 'Black' } )

Employee = type('Employee', (Person, ), { 'job' : 'Programmer' } )

请参阅http://docs.python.org/library/functions.html#type