说我有一个像这样的词典列表:
[
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来完成 - 将类中定义的方法分配给不同的类吗?
答案 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.sum
:X.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' } )