1. 元类编程
在了解元类编程之前首先要明白类这个概念,按照类的定义可以理解类是创建对象的实例的模板,Python明确说明了在Python中一切皆对象,那么可以理解类也是对象,如果类是对象,那么一定就有创建类的模板,元类编程可以说是创建类的模板
1.1 运行时动态创建类
类创建的查找顺序 : 优先查找metaclass指定的类创建,如果没有找到查找其类的继承链,之后调用type()创建类
1.1.1 常规的动态创建类的方式
/*通过用户的选择创建不同的权限的用户*/
def CreateUserClass(user) :
if user == "CommendUser" :
class CommendUser :
pass
return CommendUser
if user == "SuperUser" :
class SuperUser :
pass
return SuperUser
#() : 传递的是基类
#{} : 传递的属性
CommendUser = type("CommendUser",(),{})
SuperUser = type("SuperUser",(),{})
1.1.1 利用元类创建类
class MetaClass(type) :
def __new__(cls,*args,**kwargs) : #委托给其父类创建类
return super().__new__(cls.*args,**kwargs)
class BaseClass(metaclass = MetaClass) :
def __init__(self) :
pass
2. Django-ORM的实现
2.1 结合属性描述符完成对字段的验证
from numbers import Integral
class Fileds :
pass
class InterField(Fileds) :
def __init__(self,min_values = None,mix_values = None) :
self.min_values = min_values
self.max_values = max_values
self._values = None
"""
对min_values以及max_values做检查
"""
if not self.min_values or not self.max_values :
#抛出值为None的异常
raise ValuesError
if self.min_values > self.max_values :
#抛出区间不匹配的异常
raise ValuesError
def __get__(self,instance,owner) :
return self._values
def __set__(self,instance,value) :
if isinstance(value,Integral) :
#抛出数据类型错误异常
raise ValuesError
if value < self.min_values or value > self.max_values :
#抛出越界异常
raise ValuesError
self._values = value
class ModelMetaClass(type) :
def __new__(cls,name,bases,attrs, **kwargs):
if name == "BaseModel" :
return super().__new__(cls,name,bases,attrs,**kwargs)
#拿到所有的验证字段
#fields = { }
#for key,value in attrs.items() :
# if isinstance(value,Fields):
# fields[key] = value
_fields = { key:value for key,value in attrs.items() if isinstance(value,Fields) }
_attrs_meta = attrs.get("Meta",None)
_meta = { }
db_table = name.lower()
if _attrs_meta is not None :
table = getattr(_attrs_meta,"db_table",None)
if table is not None :
db_table = table
_meta["db_table"] = db_table
attrs["_meta"] = _meta
attrs["_fields"] = _fields
del attrs["Meta"]
return super().__new__(cls,name,bases,attrs,**kwargs)
class BaseModel(metaclass = ModelMetaClass) :
def __init__(self,*args,**kwargs):
for key,value in kwargs.items() :
setattr(self,key,value)
return super().__init__()
def save() :
pass
class UserModel(BaseModel) :
userId = InterField(min_values = 0,max_values = 100)
class Meta :
db_table = "user"