zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    C++ 类的内存分布
    Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS
    Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
    linux 入门教程
    linux shell 常用基本语法
    linux系统的7种运行级别
    Linux学习之CentOS6下Mysql数据库的安装与配置
    二叉树方面的问题
    先贴出代码C++ 中的单例模式
    C++11 中的线程、锁和条件变量
  • 原文地址:https://www.cnblogs.com/793564949liu/p/11794583.html
Copyright © 2011-2022 走看看