class NameForm(Form):
name = StringField('What is your name?')
@classmethod
def append_field(self, name, field):
setattr(self, name, field)
嗯..我需要动态创建一个新类,要求是,这个类需要继承 NameForm,这个类的名称是可以运行中指定的.就像下面一样
def create_form_class(id):
pass
form1 = create_form_class(1)
form2 = create_form_class(2)
这个对象 form1 就是一个类 Form1(NameForm) 的对象,form2 就是类 Form2(NameForm)的对象.
这个需求用 eval 可以实现,还有其他办法吗?metaclass 可以吗,但是 metaclass 可以定义类的属性,怎么去修改类名?dict可以吗?
def create_form(id):
class_name = 'Form%d' % id
Test = type(class_name, (NameForm,), {})
1
mengzhuo 2015-12-31 16:31:59 +08:00 via iPhone
metaclass 元编程
|
2
syv2 2015-12-31 16:37:26 +08:00
from copy import deepcopy
def create_from_class(id): klass = deepcopy(NameForm) klass.__name__ = str(id) return klass |
3
syv2 2015-12-31 16:38:22 +08:00
我该怎样修改刚才发出去的文本格式。。
|
4
flingjie 2015-12-31 16:38:50 +08:00 2
使用 type 函数.
def __init__(self, x): self.x = x def printX(self): print self.x Test = type('Test', (object,), {'__init__': __init__, 'printX': printX}) 等同于 class Test(object): def __init__(self, x): self.x = x def printX(self): print self.x |
5
syv2 2015-12-31 16:40:18 +08:00 1
```
from copy import deepcopy def create_from_class(id): klass = deepcopy(NameForm) klass.__name__ = str(id) return klass ``` |
6
CodingPuppy 2015-12-31 16:44:31 +08:00
@syv2 哈哈哈
|
7
TheCure OP def create_form(id):
class_name = 'Form%d' % id Test = type(class_name, (NameForm,), {}) 使用 type 搞定 |
8
syv2 2015-12-31 17:27:45 +08:00
type 的工厂模式确实更高效,学习了!
|
9
lxy42 2015-12-31 17:35:42 +08:00 1
用 type ,楼上已有例子了,另外可以参考标准库 collections.namedtuple 的实现, namedtuple 就是动态创建的。
|
10
Mark24 2015-12-31 20:10:24 +08:00
metaClass
|
11
lilindun 2016-01-01 12:27:12 +08:00
《 fluent python 》 之 metaprogramming
|