千家信息网

怎么使用Python描述器实现ORM模型

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍"怎么使用Python描述器实现ORM模型",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用Python描述器实现ORM模型"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2026年11月02日怎么使用Python描述器实现ORM模型

本文小编为大家详细介绍"怎么使用Python描述器实现ORM模型",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用Python描述器实现ORM模型"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

访问或者修改描述器对象的属性时无法触发__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或FalseCharField(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):        passclass 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):        passclass 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):        passclass 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)        #         return self.value    def __set__(self, instance, value):        """        :param instance: 修改的对象        :param value: 修改的值        :return:        """        print('---set---方法被触发了')        self.value = value    def __delete__(self, instance):        passclass 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)        #         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 = Noneclass 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 >        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 = Noneclass 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 = Noneclass 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描述器实现ORM模型"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

方法 模型 对象 属性 就是 数据 输出 尝试 普通 字符 应用 字段 字符串 整数 长度 数据库 文章 最大 内容 小数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 苏州找大状互联网科技有限公司 科技互联网项目 互联网科技会 关于新基建和互联网科技 期待互联网科技 互联网科技公司官网 奇酷互联网科技公司 广州宏创互联网科技 贷财互联网科技 凡科互联网科技 狮子座互联网科技有限公司 互联网公司会议桌创意科技软装饰 广州优美互联网科技 来此购互联网科技有限公司 宜昌元轩互联网科技有限公司 西安小鹰速贷互联网科技有限公司 互联网科技大赛获奖感言 科技赋能视角下互联网保险发展 互联网科技创新创业项目 互联网 科技节活动 微视频大赛 科技与互联网 科技服务与互联网 狮子座互联网科技有限公司 科技互联网创业计划书 港股科技和互联网 互联网科技的全部知识 科技赋能视角下互联网保险发展 华中科技大学互联网的牛人 滨湖区互联网智能科技产品有哪些 元气玛特互联网科技公司是外包吗
0