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)