11.04默写

元类

什么是元类?

元类就是类的类,type是所有类的类,type就是一个元类

元类的作用?

元类可以控制类的创建
元类可以控制类的调用

如何定义元类?如何使用元类?

自定义一个元类,继承type,派生出自己的属性与方法
通过metaclass指定定义好的元类

class 类名(metaclass=自定义的元类名):
    pass

ORM是什么?使用ORM的好处

ORM是对象关系映射,映射到数据库MySQL中的数据表
将数据库的增删改查全部封装成一个个方法,方便调用

字段类

class Field:
    def __init__(self,name,column_type,primary_key,default):
        self.name = name
        self.column_type = column_type
        self.primary_key = primary_key
        self.default = default
#整型
class IntegerField(Field):
    def  __init__(self,name,column_type='int',primary_key=False,default=0):
        super().__init__(name,column_type,primary_key,default)
#字符串
class StringField(Field):
    def __init__(self,name,column_type='varchar(64)',primary_key=False,default=None):
        super().__init__(name,column_type,primary_key,default)

模型表类

class User(Models):
    user_id = IntegerField(name='user_id',primary_key=True)
    user_name = StringField(name='name')
    pwd = StringField(name='pwd')

Models类

class Models(dict,metaclass=OrmMetaClass):
    def __getattr__(self,item):
        return self.get(item)
    def __setattr__(self,key,value):
        self[key] = value

元类

class MyMeta(type):
    def __init__(self,class_name,class_base,class_dict):
        if not class_name.istitle():
            raise TypeError('类首字母必须大写')
        if not class_dict.get('__doc__'):
            raise TypeError('类内部必须有注释')
        super().__init__(class_name,class_base,class_dict)
        
    def __call__(self,*rags,**kwrags):
        obj = object.__new__(self)
        obj.__init__(*rags,**kwrags)
        return obj
class OrmMetaClass(type):
    def __new__(cls,class_name,class_base,class_dict):
        if class_name = 'Models':
            return type.__new__(cls,class_name,class_vase,class_dict)
        table_name = class_dict.get('table_name',class_name)
        primary_key = None
        mappings = {}
        for key,value in class_dict.items():
            if isinstance(value,Field):
                mappings[key] = value
                if value.primary_key:
                    raise TypeError('只能有一个主键')
                primary_key = value,name
        for key in mappings.keys():
            class_dict.pop(key)
        if not primary_key:
            raise TypeError('必须有一个主键')
        class_dict['table_name'] = table_name
        class_dict['primary_key'] = primary_key
        class_dict['mappings'] = mappings
        return type.__new__(cls,class_name,class_base,class_dict)

猜你喜欢

转载自www.cnblogs.com/793564949liu/p/11794583.html