在python3 利用metaclass 实现简单orm 映射
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')
#metaclass 封装mapping 元素
class ModelMetaclass(type):
# __new__方法接受的参数依次是:
# 1.当前准备创建的类的对象(cls)
# 2.类的名字(name)
# 3.类继承的父类集合(bases)
# 4.类的方法集合(attrs)
def __new__(cls, name, bases, attrs):
# 如果说新创建的类的名字是Model,那直接返回不做修改
if name == "Model":
return type.__new__(cls, name, bases, attrs)
print("Found model:%s" % name)
mappings = dict()
for k, v in attrs.items():
if isinstance(v, Field):
print("Found mappings:%s ==> %s" % (k, v)) # 找到映射, 这里用到上面的__str__
mappings[k] = v
# 结合之前,即把之前在方法集合中的零散的映射删除,
# 把它们从方法集合中挑出,组成一个大方法__mappings__
# 把__mappings__添加到方法集合attrs中
for k in mappings.keys():
attrs.pop(k)
attrs["__mappings__"] = mappings
attrs["__table__"] = name # 添加表名,假设表名与类名一致
return type.__new__(cls, name, bases, attrs)
# 编写Model基类,所有继承子类自动对filed 增加
class Model(dict,metaclass=ModelMetaclass):
def __init__(self, **kw):
super(Model, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Model' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
def save(self):
fields = []
params = []
args = []
# 在所有映射中迭代
for k, v in self.__mappings__.items():
fields.append(v.name)
params.append("?")
args.append(getattr(self, k, None))
sql = "insert into %s (%s) values (%s)" % (self.__table__, ",".join(fields), ",".join(params))
print("SQL: %s" % sql)
print("ARGS: %s" % str(args))
class User(Model):
# 定义类的属性到列的映射:
id = IntegerField('id')
name = StringField('username')
email = StringField('email')
password = StringField('password')
u = User(id=12345, name='hunterfox', email='test@orm.org', password='12345678')
u.save()
print(id(u))
python3 metaclass orm
最新推荐文章于 2021-03-05 08:57:00 发布