元类+ORM实现

当定义一个函数、类、全局变量时,其实就是创建一个对象,然后再globals获取的这个字典中添加一个名字,让这个名字指向刚刚创建的对象空间而已。
元类(造物主级别)——>创建类——>创建实例对象

使用type创建类

type还有一种完全不同的功能,动态的创建类。
type可以接受一个类的描述作为参数,然后返回一个类。(要知道,根据传入参数的不同,同一个函数拥有两种完全不同的用法是一种很傻的事情,但这在python中为了保持向后兼容性)
type可以像这样工作:
type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
例子:

test2=type("test2",(),{
     "num":100,"num2":200})
test3=type("test3",(test2,),{
     "num":100,"num3":200})

添加实例方法:

def aa():
	pass
test3=type("test3",(test2,),{
     "num":100,"num3":200,"a":aa})

添加类方法:

@classmethod
    	def test_3(cls):
   		print("zheshileifangfa")
 test3=type("test3",(),{
     "test_3":test_3})

元类实现ORM

ORM是python编辑语言后端web框架Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.
一句话解释就是:创建一个实例对象,用创建它的类名当作数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句
元类+ORM实现_第1张图片

#定义元类
class ModelMetaclass(type):
    def __new__(cls, name, bases, attrs):
        mappings=dict()
        #判断是否需要保存
        for k,v in attrs.items():#items作用,按关键字遍历
            #判断是否指定的StringFiled或者IntegerFiled的实例对象
            if isinstance(v,tuple):
                print('Found mapping %s==>%s'%(k,v))
                mappings[k]=v
        #删除这些已经在字典中存储的属性
        for k in mappings.keys():
            attrs.pop(k)
        #将之前的uid/name/email/password以及对应的对象引用、类名字
        attrs['__mappings__']=mappings #保存属性和列的映射关系
        attrs['__table__']=name #假设表明和类名一致
        return type.__new__(cls,name,bases,attrs)
class Model(object,metaclass=ModelMetaclass):
    def __init__(self,**kwargs):
        for name,value in kwargs.items():
            setattr(self,name,value)
    def save(self):
        fileds=[]
        args=[]
        for k,v in self.__mappings__.items():
            fileds.append(v[0])
            args.append(getattr(self,k,None))
        args_temp=list()
        for temp in args:
            #判断如果是数字类型
            if isinstance(temp,int):
                args_temp.append(str(temp))
            elif isinstance(temp,str):
                args_temp.append("""'%s'"""%temp)
        sql='insert into %s(%s)values(%s)'%(self.__table__,','.join(fileds),','.join(args_temp))
        print('SQL:%s'%sql)

class User(Model):
    uid=('uid',"int unsigned")
    name=('username',"varchar(30)")
    email=('email',"varchar(30)")
    password=('password',"varchar(30)")
u=User(uid=12345,name="zhang",email='[email protected]',password='my-pwd')
u.save()

你可能感兴趣的:(python)