python 64式: 第11式、元类

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
关键:
1 元类
含义:创建类的东西,用来创建这些类,是类的类
作用:1) 修改类,返回修改后的类
    2) 对象关系映射,将定义的简单类转变成对数据库的操作
目的: 当创建类时能够自动改变类,希望可以创建符合当前上下文的类
类的类型是type,type可以动态创建类,
可以接收类的描述符作为参数,然后返回一个类
class ListMetaClass(type):
    # __new__(当前准备创建的类的对象,类的名字,类继承的父类集合,类的方法集合)
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)

class MyList(list):
    # 指示使用元类L来定义类的创建
    __metaclass__ = ListMetaClass

2 type可以接收一个字典为类定义属性
type():
含义:是内建函数,可以动态创建类,接收类名作为参数,返回类
本质:是创建所有类的元类。
用法: type(类名,父类的元组【针对继承的情况,可以为空】,包含属性或方法的字典) 
def fn(self, name=''):
    return name
Student = type('Student', (object,), {'getName': fn, 'age': 25})
print Student.age
student = Student()
name = student.getName('chen')

总结:
元类本质上是类的类,即类是元类的实例。由于元类可以定制化类的特性,会被用于
对象关系映射,添加自定义类方法等。效果等同于type(name, base, attrs)创建的类。

参考:
[1] http://blog.jobbole.com/21351/
[2] https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820064557c69858840b4c48d2b8411bc2ea9099ba000
[3] http://python.jobbole.com/88795/
'''

class Field(object):
    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type

    def __str__(self):
        return '%s:%s' % (self.__class__.__name__, self.name)


class StringField(Field):
    def __init__(self, name):
        super(StringField, self).__init__(name, 'varchar(100)')


class IntegerField(Field):
    def __init__(self, name):
        super(IntegerField, self).__init__(name, 'bigint')


class ModelMetaclass(type):
    # __new__(当前准备创建的类的对象,类的名字,类继承的父类集合,类的方法集合)
    def __new__(cls, name, bases, attrs):
        if 'Model' == name:
            return type.__new__(cls, name, bases, attrs)
        mappings = dict()
        for k, v in attrs.iteritems():
            if isinstance(v, Field):
                mappings[k] = v
        # 将原来属性字典中已经有Field的键值对删除,否则运行错误
        for k in mappings.iterkeys():
            attrs.pop(k)
        # 假设表名和类名一致
        attrs['__table__'] = name
        # 保存属性和值的映射关系
        attrs['__mappings__'] = mappings
        return type.__new__(cls, name, bases, attrs)


class Model(dict):
    __metaclass__ = ModelMetaclass

    def __init__(self, **kw):
        super(Model, self).__init__(**kw)

    def __getattr__(self, key):
        return self[key]

    def save(self):
        fields = []
        values = []
        # 遍历属性和值的映射
        for k, v in self.__mappings__.iteritems():
            fields.append(v.name)
            values.append(str(getattr(self, k, None)))
        sql = 'insert into %s (%s) values (%s)' % (self.__table__,
                                                   ','.join(fields),
                                                   ','.join(values))
        print "sql: %s" % (sql)


class User(Model):
    # 定义类的属性到列的映射
    id = IntegerField('id')
    name = StringField('username')

def userMetaClassORM():
    u = User(id=12345, name='Chen')
    # 保存到数据库,由metaclass完成
    u.save()


def process():
    userMetaClassORM()


if __name__ == "__main__":
    process()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值