#!/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()