零基础学Phyton程序园

python中最难使用的魔术代码metaclass编写ORM框架

2019-05-11  本文已影响7人  墨马

使用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可以改变类创建时的行为,这种强大的功能使用起来务必小心。

上一篇下一篇

猜你喜欢

热点阅读