from numbers import Integral
class IntFiled: ###数据描述符
def __set__(self, instance, value):
print(instance,value)
if not isinstance(value,Integral):
raise ValueError("int value need")
if value <=0 or value>100:
raise ValueError("0<age<100")
self.value=value
def __get__(self, instance, owner):
print(instance,owner)
return self.value
def __delete__(self, instance):
pass
class User:##ORM model 定义
age=IntFiled()
user=User()
user.age=12
print(user.age)
代码示例2
from numbers import Integral
class ModelField():
pass
class CharField(ModelField):
def __init__(self,db_column,max_length=None):
self._value=None
self.db_column=db_column
self.max_length=max_length
if max_length is not None:
if not isinstance(max_length,Integral):
raise ValueError('max_length must be int')
elif max_length<1:
raise ValueError('max_length must be gt 1')
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
if not isinstance(value,str):
raise ValueError('value must be str')
elif len(value)>self.max_length:
raise ValueError('max_length max value is %s'%self.max_length)
self._value= value
class IntField(ModelField):
def __init__(self,db_column):
self._value=None
self.db_column=db_column
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
if not isinstance(value,Integral):
raise ValueError('value must be int')
elif value<0:
raise ValueError('value must be > 0')
self._value= 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,ModelField):
fields[key]=value
attrs_meta=attrs.get('Meta',None)
table_name=name.lower()
if attrs_meta:
table=getattr(attrs_meta,'table_name',None)
if table:
table_name=table
_meta={}
_meta["table_name"]=table_name
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(self):
columns=[]
values=[]
for key,value in self.fields.items():
db_column= value.db_column if value.db_column else key.lower()
columns.append(db_column)
if isinstance(getattr(self,key),str):
value="'"+getattr(self,key)+"'"
else:
value=str(getattr(self,key))
values.append(value)
sql="insert into {table_name} ({columns}) values({values})".format(table_name=self._meta['table_name'],columns=",".join(columns),values=",".join(values))
print(sql)##insert into user (aaa,age) values('zhangsan',12)
class UserModel(BaseModel):
name=CharField(db_column="aaa",max_length=32)
age=IntField(db_column="age")
class Meta:
table_name="user"
if __name__=='__main__':
user=UserModel()
="zhangsan"
user.age=12
user.save()
















