使用metaclass给自定义的MyList增加一个add方法:
定义ListMetaclass
定义metaclass的类名时习惯以Metaclass结尾
#metaclass是类的模板,所以必须‘type’类型的派生
class ListMetaclass(type):
def _new_(cls,name,bases,attrs):
attrs['add'] = lambda self,value:self.append(value)
return type._new_(cls,name,bases,attrs)
_new_()方法的参数:
1:当前准备创建的类的对象;
2:类的名字;
3:类继承的父类集合;
4类的方法集合;
指示使用ListMetaclass来定制类,传入关键字参数metaclass:
class MyList(list,metaclass = ListMetaclass):
pass
通过传入metaclass,指示Python解释器在创建MyList时,要通过ListMetaclass._ new _()来创建此时MyList具有了add()方法。
OPR(Object Relational Mapping)对象关系映射
把关系数据库的一行映射为一个对象,也就是一个类对应一个表,由于需要根据表的结构定义对应的类,所以类只能动态定义。
比如定义一个User类操作对应的表,想使用如下简介的代码

其中Model和StringField、IntegerField由ORM框架提供
1.定义Field类

定义各种类型的Field

编写ModelMetaclass:

编写基类Model


接下来测试一下
u = User(id=12345,name='Michael',email='test@orm.org',password='my-pwd')
u.save()
输出如下

metaclass可以改变类创建时的行为,这种强大的功能使用起来务必小心。
网友评论