Python使用描述器实现ORM模型的方法详解
程序员文章站
2022-06-09 22:22:29
目录1.__set__方法:设置属性2.__get__方法:访问属性3.__delete__方法:删除属性4.描述器实现orm模型:总结访问或者修改描述器对象的属性时无法触发__setattr__等方...
访问或者修改描述器对象的属性时无法触发__setattr__等方法,只会触发描述器类内部的__set__,__get__,__delete__方法.
orm模型:类名对应表名,对象对应的数据行,类属性对应数据行的各字段,有几个表字段,就绑定几个类属性;往表中增加数据就是创建对象,每创建一个对象,就是增加一行数据记录。
orm框架的功能:
1.建立模型类和表之间的对应关系,允许我们通过面向对象的方式操作数据库。
2.根据设计的模型类生成数据库中的表格。
3.通过方便的配置就可以进行数据库的切换。
mysql的常用数据类型:
1.整数:int,bit
2.小数:decimal(decimal表示浮点数,decimal(5,2)表示共计5位数,小数占2位)
3.字符串:varchar(可变长度),char(不可变长度)
4.日期时间:date,time,datetime
5.枚举类型:enum
模型类案例:
""" django的orm模型字段 booleanfield: 布尔字段,true或false charfield(max_length=最大长度): 字符串,参数max_length表示最大字符个数 integerfield: 整数 """ class testreport(basetable): class meat: verbose_name = '测试报告' db_table = "testreport" report_name = models.charfield(max_length=40, null=false) start_at = models.charfield(max_length=40, null=true) status = models.booleanfield() testrun = models.integerfield() successes = models.integerfield() reports = models.textfield()
1.__set__方法:设置属性
""" 只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在orm模型中) """ class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): pass def __set__(self, instance, value): print('---set---方法被触发了') def __delete__(self, instance): pass class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 输出: ---set - --方法被触发了 none
class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): pass def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value print(self) # <__main__.field object at 0x7fecc01f8a30> print(instance) # <__main__.model object at 0x7fecc01f8a00> print(value) # 666 def __delete__(self, instance): pass class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() print(m) # <__main__.model object at 0x7fecc01f8a00>,与instance相同 m.attr = 666 # 尝试修改attr属性
2.__get__方法:访问属性
""" 只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在orm模型中) """ class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): pass class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 输出: ---set - --方法被触发了 ---get - --方法被触发了 none
""" 只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在orm模型中) """ class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') print(instance) # <__main__.model object at 0x7f80b81a09d0> print(owner) # <class '__main__.model'> return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): pass class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() m.attr = 666 # 尝试修改attr属性 print(m.attr) # 666 # 输出: ---set - --方法被触发了 ---get - --方法被触发了 < __main__.model object at 0x7f80b81a09d0 > < class '__main__.model'> 666
3.__delete__方法:删除属性
""" 只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在orm模型中) """ class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): print('---delete---方法被触发了') class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() m.attr = 666 # 尝试修改attr属性 del m.attr # ---delete---方法被触发了 print(m.attr) # none # 输出: ---set - --方法被触发了 ---delete - --方法被触发了 666
""" 只要一个类中出现了: __get__(self,instance,owner) __set__(self,instance,value) __delete__(self,instance) __set_name__(self,owner,name) 中的任意一个方法,这个类就不是一个普通的类了, 应被称为: 描述器类(应用在orm模型中) """ class field(object): """ 只要一个类中出现了以下任意一个方法,这个类就是一个描述器类 """ def __get__(self, instance, owner): print('---get---方法被触发了') print(instance) # <__main__.model object at 0x7f80b81a09d0> print(owner) # <class '__main__.model'> return self.value def __set__(self, instance, value): """ :param instance: 修改的对象 :param value: 修改的值 :return: """ print('---set---方法被触发了') self.value = value def __delete__(self, instance): print('---delete---方法被触发了') print(instance) # <__main__.model object at 0x7ff61806a160> self.value = none class model(object): attr = field() # attr是一个描述器对象,修改时无法触发__setattr__等方法, # 只能触发描述器类内部的__set__方法 if __name__ == '__main__': m = model() m.attr = 666 # 尝试修改attr属性 del m.attr # ---delete---方法被触发了 print(m.attr) # none # 输出: ---set - --方法被触发了 ---delete - --方法被触发了 < __main__.model object at 0x7ff61806a160 > ---get - --方法被触发了 < __main__.model object at 0x7ff61806a160 > <class '__main__.model'> none
4.描述器实现orm模型:
""" 通过描述器实现orm模型 """ class charfield(object): def __init__(self,max_length=20): self.max_length = max_length def __get__(self, instance, owner): return self.value def __set__(self, instance, value): # 首先判断是否为空 if value is not none: # 再判断是否是字符串 if isinstance(value, str): # 再判断长度是否符合要求 if len(value) <= self.max_length: self.value = value else: raise typeerror('length need less than {}'.format(self.max_length)) else: raise typeerror('need a str') else: raise typeerror("can not be none") def __delete__(self, instance): self.value = none class integerfield(object): def __get__(self, instance, owner): return self.value def __set__(self, instance, value): # 首先判断是否为空 if value is not none: # 再判断是否是整数int if isinstance(value, int): self.value = value else: raise typeerror('need a int') else: raise typeerror("can not be none") def __delete__(self, instance): self.value = none class usermodel(object): # 定义用户信息的模型类 name = charfield(max_length=20) # 定义:name只能赋值为字符串 pwd = charfield(max_length=40) age = integerfield() # 定义:age只能赋值为整数 if __name__ == '__main__': user = usermodel() user.name = "春田" print(user.name) # 输出: 春田 user.age = 130 print(user.age) # 输出: 130 user.pwd = 'wsdgdgdrgerdsfs方式范德萨发阿瑟费萨法 sfa fda fsdf sdf fg' print(user.pwd) # 输出: typeerror: length need less than 40
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: Python装饰器实现函数运行时间的计算
下一篇: 两个表的分页有关问题