我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python使用描述器实现ORM模型的方法详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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或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
 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!  

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python使用描述器实现ORM模型的方法详解

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

下载Word文档

猜你喜欢

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

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

如何使用Python实现一个简易的ORM模型

目录元类描述器本文记录下自己使用Python实现一个简易的ORM模型 使用到的知识 1、元类 2、描述器 元类 对于元类,我的理解其实也便较浅,大概是这个意思 所有的类都是使用元类来进行创建的,而所有的类的父类中必然是object(针对Py
2022-06-02

Python实现多元线性回归模型的方法详解

多元线性回归是一种广泛应用于数据分析和机器学习的统计模型。它通过使用多个自变量来预测一个或多个因变量的值。在Python中,我们可以使用许多不同的库和框架来实现多元线性回归模型,例如NumPy、Pandas和Scikit-Learn等。下面
Python实现多元线性回归模型的方法详解
2024-01-24

Python使用机器学习模型实现温度预测详解

使用 Python 可以使用机器学习模型进行温度预测。常用的模型有回归分析、随机森林等。本文就来和大家来了具体实现方法,希望对大家有所帮助
2023-01-31

详解Python使用simplejson模块解析JSON的方法

1,Json模块介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Stan
2022-06-04

Python实现操作Redis所有类型的方法详解

目录Redis的数据类型字符串(String)哈希(Hash)列表(List)集合(Set)有序集合(Sorted Set)Redis的高级用法事务发布订阅当今互联网时代,数据处理已经成为了一个非常重要的任务。而Redis作为一款高性能的N
2023-04-19

使用Python实现控制摄像头的方法详解

当今,随着计算机技术的发展,摄像头已经成为了人们生活中不可或缺的一部分。而Python作为一种流行的编程语言,也可以轻松地控制和操作摄像头。本文将介绍如何使用Python中的常用库(例如OpenCV和Tkinter)来控制和操作摄像头,需要的可以参考一下
2023-03-10

一文详解Python中itertools模块的使用方法

itertools是python内置的模块,使用简单且功能强大。这篇文章主要为大家详细介绍了itertools模块的使用方法,感兴趣的小伙伴可以了解一下
2023-03-22

使用Python实现桥接模式的代码详解

Python桥接模式代码详解摘要桥接模式将抽象和实现分离,允许独立修改。在Python中,抽象类定义接口,由具体类实现。接口定义了方法,具体类必须实现。创建抽象类和具体类的实例,并动态改变实现。桥接模式提供了解耦、可扩展性、可读性和可维护性优势。它适用于需要分离抽象和实现,或需要动态更改对象实现的场景。
使用Python实现桥接模式的代码详解
2024-04-02

详解Java注解的实现与使用方法

详解Java注解的实现与使用方法Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,特此说明一下。如何创建一个注解 每一个自定义的注解都由四个元注解组成,这四个元注解由java本身提供
2023-05-31

C#使用泛型方法设计实现单向链表详解

本篇文章讲解了使用泛型方法设计实现单向链表的步骤,包括创建泛型类、定义内部节点类、实现添加和删除方法以及实现其他非泛型方法。该实现可处理各种类型的数据,使单向链表类更通用。举例说明了如何使用该类创建、添加、删除链表节点,并展示了输出结果。
C#使用泛型方法设计实现单向链表详解
2024-04-02

Python调用实现最小二乘法的方法详解

所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。本文主要和大家分享Python调用实现最小二乘法的方法,需要的可以参考一下
2023-05-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录