python实现ORM框架(元类的理解与使用)

'''ORM框架实现'''

class Field(object): #python中的基类声明所有可能的传参

def __init__(self, name,value):

self.name = name

 

def __str__(self): #党类单独存在时,打印的信息

return ("%s" % self.__class__.__name__)

 

class IntField(Field):

def __init__(self, name):

super(IntField, self).__init__(name, 'INT')

 

 

class StringField(Field):

def __init__(self, name):

super(StringField, self).__init__(name, 'STR')

 

'''元类编程的核心在于类的定制'''

 

#type类是所有类的基类,使用type创建Model与User类

#User创建时,进入 metaclass进行创建

#Model类进行创建时, metaclass进行创建

 

class ModelMetaclass(type):

def __new__(cls, name, bases, attrs):

#假设创建的是Model,控制Model的创建行为

if name == "Model":

return type.__new__(cls, name, bases, attrs)

 

#假设创建的是User类,控制User创建的行为

mappings = dict()

for k,v in [(key, value) for key, value in attrs.items() if isinstance(value, Field)]:

print("mapping items is (%s , %s)" % (k, v))

mappings[k] = v

 

attrs.clear()

 

attrs['__mapping__'] = mappings

attrs['__table__'] = name

 

return type.__new__(cls, name, bases, attrs)

 

#Modellei操作元类创建出的mappings,执行一些操作

class Model(dict, metaclass=ModelMetaclass):

def __init__(self, **kwargs):

super(Model, self).__init__(**kwargs)

 

def __setattr__(self, name, value):

self[name] = value

 

def __getattr__(self, name):

return self[name]

 

def save(self):

fields = []

params = []

args = []

for k, v in self.__mapping__.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 = IntField("id")

name = StringField("name")

email = StringField('email')

passwd = StringField('passwd')

 

if __name__ == "__main__":

u = User(id=12345, name='Michael', email='test@orm.org', passwd='my-pwd')

u.save()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值