美文网首页零基础学Phyton程序园
python中最难使用的魔术代码metaclass编写ORM框架

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

作者: 墨马 | 来源:发表于2019-05-11 11:04 被阅读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可以改变类创建时的行为,这种强大的功能使用起来务必小心。

    相关文章

      网友评论

        本文标题:python中最难使用的魔术代码metaclass编写ORM框架

        本文链接:https://www.haomeiwen.com/subject/mentaqtx.html