iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么使用Python描述器实现ORM模型
  • 609
分享到

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

2023-06-29 04:06:42 609人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

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

访问或者修改描述器对象的属性时无法触发__setattr__等方法,只会触发描述器类内部的__set__,__get__,__delete__方法.

ORM模型:类名对应表名,对象对应的数据行,类属性对应数据行的各字段,有几个表字段,就绑定几个类属性;往表中增加数据就是创建对象,每创建一个对象,就是增加一行数据记录。

ORM框架的功能:

建立模型类和表之间的对应关系,允许我们通过面向对象的方式操作数据库

根据设计的模型类生成数据库中的表格。

通过方便的配置就可以进行数据库的切换。

MySql的常用数据类型:

整数:int,bit

小数:decimal(decimal表示浮点数,decimal(5,2)表示共计5位数,小数占2位)

字符串:varchar(可变长度),char(不可变长度)

日期时间:date,time,datetime

枚举类型: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)        # <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):        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)        # <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 = 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 >    <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 = 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模型”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: 怎么使用Python描述器实现ORM模型

本文链接: https://www.lsjlt.com/news/322495.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用Python描述器实现ORM模型
    本文小编为大家详细介绍“怎么使用Python描述器实现ORM模型”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python描述器实现ORM模型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。访问或者修改描...
    99+
    2023-06-29
  • Python使用描述器实现ORM模型的方法详解
    目录1.__set__方法:设置属性 2.__get__方法:访问属性3.__delete__方法:删除属性 4.描述器实现ORM模型: 总结访问或者修...
    99+
    2024-04-02
  • python利用元类和描述器实现ORM模型的详细步骤
    ORM模型: ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了 ORM(Object Relational Mapping)对象关系映...
    99+
    2024-04-02
  • 使用Python怎么实现一个ORM模型
    本篇文章为大家展示了使用Python怎么实现一个ORM模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。元类对于元类,我的理解其实也便较浅,大概是这个意思所有的类都是使用元类来进行创建的,而所有的类...
    99+
    2023-06-15
  • Python怎么使用描述符实现属性类型检查
    这篇“Python怎么使用描述符实现属性类型检查”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python怎么使用描述符实现...
    99+
    2023-06-30
  • Python中的描述器怎么使用
    这篇文章主要介绍“Python中的描述器怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的描述器怎么使用”文章能帮助大家解决问题。概述Python描述器是一个Python对象,它...
    99+
    2023-07-05
  • Python虚拟机中描述器怎么实现
    在Python虚拟机中,描述器(Descriptor)是一种特殊的对象,它可以在类的属性访问过程中定义和控制对属性的访问。 要实现一...
    99+
    2024-04-09
    Python
  • Python描述符怎么用
    这篇文章主要介绍“Python描述符怎么用”,在日常操作中,相信很多人在Python描述符怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python描述符怎么用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-17
  • Python使用描述符实现属性类型检查的案例解析
    目录1、如何使用描述符对实例属性做类型检查?实际案例:解决方案:2、代码演示1、如何使用描述符对实例属性做类型检查? 实际案例: 在某项目中,我们实现了一些类,并希望能像静态类型语言...
    99+
    2024-04-02
  • 怎么在Python描述器中调用__getattribute__
    今天就跟大家聊聊有关怎么在Python描述器中调用__getattribute__,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python有哪些常用库python常用的库:1.re...
    99+
    2023-06-14
  • html中的描述列表怎么实现
    这篇“html中的描述列表怎么实现”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“html中的描述列表怎么实现”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入...
    99+
    2023-06-08
  • 深入理解Python虚拟机中描述器的实现原理
    目录描述器的基本用法描述器的实现原理描述器的应用场景实现属性访问控制实现数据验证和转换实现延迟加载和缓存实现 ORM 映射总结在本篇文章当中主要给大家介绍一个我们在使用类的时候经常使...
    99+
    2023-05-19
    Python虚拟机描述器实现原理 Python 描述器 Python虚拟机
  • python虚拟机之描述器实现原理与源码分析
    目录从字节码角度看描述器描述器源码分析总结从字节码角度看描述器 在前面的内容当中我们已经详细分析了描述器的使用和其相关的应用,我们通常使用描述器都是将其作为类的一个类属性使用,而使用...
    99+
    2023-05-19
    python虚拟机描述器实现原理 python虚拟机描述器实现源码 python虚拟机 python描述器实现
  • Python怎么实现RFM用户分析模型
    本篇内容介绍了“Python怎么实现RFM用户分析模型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!看这篇文章前源数据长这样:学完后只要敲一...
    99+
    2023-06-16
  • Python之ORM框架怎么使用
    本文小编为大家详细介绍“Python之ORM框架怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python之ORM框架怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、Python语言中有哪些常...
    99+
    2023-07-02
  • 怎么使用Python元类编程实现一个简单的ORM
    这篇文章主要讲解了“怎么使用Python元类编程实现一个简单的ORM”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Python元类编程实现一个简单的ORM”吧!概述什么是ORM   ...
    99+
    2023-07-05
  • JavaScript面向对象之属性描述符怎么使用
    本文小编为大家详细介绍“JavaScript面向对象之属性描述符怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript面向对象之属性描述符怎么使用”文章能帮助大家解决疑惑,下面跟着小编...
    99+
    2024-04-02
  • 使用 Python ORM 实现高效的数据持久性
    对象关系映射(ORM)是一种技术,它允许在面向对象编程语言和关系数据库之间建立桥梁。使用 Python ORM 可以显著简化数据持久性操作,从而提高应用程序的开发效率和可维护性。 优势 使用 Python ORM 具有以下优势: 减少样...
    99+
    2024-03-15
    ORM
  • 如何使用Python元类特性实现ORM框架
    这篇文章主要介绍了如何使用Python元类特性实现ORM框架,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ORM是什么O是 object,也就 类对象 的意思,R是 rela...
    99+
    2023-06-15
  • Python怎么用tkinter和socket实现端口扫描
    这篇文章主要介绍“Python怎么用tkinter和socket实现端口扫描”,在日常操作中,相信很多人在Python怎么用tkinter和socket实现端口扫描问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作