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)
posted @ 2019-11-04 20:34  断指轩辕  阅读(118)  评论(0编辑  收藏  举报