Python Web开发技巧X

news2024/9/29 11:41:02

目录

生成器对象的三种创建方式

classmethod和staticmethod

__class__属性

python创建一个类会依次去调用哪些方法

__new__和__init__实现单例模式的饿汉式和懒汉式


 

  select_related 和 prefetch_related 是 Django ORM 提供的两个查询优化方法,用于减少数据库查询的数量和提高性能。

  select_related 方法用于在查询时一次性获取相关联的外键对象。可避免多次查询数据库获取关联对象,从而减少数据库访问次数。适用于一对一和多对一关系的查询。方法如下:

# 获取单个对象并关联查询外键对象
obj = MyModel.objects.select_related('related_field').get(id=1)

# 获取多个对象并关联查询外键对象
objs = MyModel.objects.select_related('related_field')

# 在连续的关联字段上进行关联查询
objs = MyModel.objects.select_related('related_field__another_related_field')

   prefetch_related 方法用于在查询时一次性获取相关联的多对多或者一对多的对象集合。这样可以避免多次查询数据库来获取关联对象集合,从而减少数据库访问次数。使用方法如下:

# 获取单个对象并关联查询多对多关系的对象集合
obj = MyModel.objects.prefetch_related('many_to_many_field').get(id=1)

# 获取多个对象并关联查询多对多关系的对象集合
objs = MyModel.objects.prefetch_related('many_to_many_field')

# 在连续的关联字段上进行关联查询
objs = MyModel.objects.prefetch_related('related_field__another_related_field')

        注意:select_related 和 prefetch_related 方法都需在查询时使用,而不是在对象上使用。另外,这两个方法并不适用于所有情况,具体使用哪个方法取决于你的数据模型和查询需求。在某些情况下,可能需要结合使用这两个方法来最大程度地优化查询性能。

        还有 Subquery 子查询,给 annotate 赋默认值的 Coalesce 函数,用 OuterRef 调用父查询外部ID,例如给一个表A,表A有外键B,表B有外键C,需要计数C,那么这是就可以用:

query_set.annotate(
    result_count=Coalesce(
        Subquery(
            A.filter(B__C=OuterRef('pk'), enabled=True).values("A").annotate.count=Count('pk')).values('count')
    ), 0)
)
# 最后就是query_set多带了个result_count字段值处理,就是count就是子查询列表的数,再由value取出

生成器对象的三种创建方式

        生成器(Generator)是一种特殊的迭代器,允许你在迭代过程中按需生成值

(1)生成器函数:用 yield 关键字定义的函数。调用该函数时,会返回一生成器对象。可用next()函数或 for 循环迭代生成器中的值。

def simple_generator():
    yield "Hello"
    yield "World"

gen = simple_generator()
for value in gen:
    print(value)

(2)生成器表达式:类似于列表推导式,但是使用圆括号()而不是方括号[]。生成器表达式会返回一个生成器对象,而不是一个列表。这在处理大量数据时非常有用,因为它可以节省内存。

numbers = range(10)
square_gen = (x ** 2 for x in numbers)

for square in square_gen:
    print(square)

(3)使用itertools模块:Python的itertools模块提供了许多生成器函数,可用于创建各种复杂的生成器。例如,itertools.count()函数可以创建一个无限递增序列的生成器。

import itertools

counter = itertools.count(1)  # 从1开始的无限递增序列

for i in range(5):
    print(next(counter))

        注:生成器能节省内存,因为它们在迭代过程中按需生成值,而不是一次性生成所有值。这意味着在任何给定时间点,生成器只需要在内存中存储当前生成的值,而不是整个序列。这在处理大量数据或无限序列时非常有用,因为它可以显著降低内存使用。

classmethod和staticmethod

        classmethodstaticmethod都是Python类中定义方法的装饰器,classmethodstaticmethod都是Python类中定义方法的装饰器。

classmethod

  • classmethod类本身作为第一个参数传递,通常命名为cls
  • 可在类方法中访问和修改类属性
  • 类方法可以被子类覆盖,这如果子类定义了具有相同名称的类方法,则子类将用自己的实现。
class MyClass:
    _count = 0

    @classmethod  # 装饰器
    def increment_count(cls):  # cls代表类本身
        cls._count += 1  # 可访问类属性

    @classmethod
    def get_count(cls):
        return cls._count

MyClass.increment_count()   # 类本身访问
print(MyClass.get_count())  # 输出:1

staticmethod

  • staticmethod不接受特殊的第一个参数,意味着它不能访问类属性和方法
  • 静态方法不能被子类覆盖,意味着子类不能提供自己的实现。
  • 常用于实现与类相关的实用程序功能,但不需要访问类的属性或方法
class MyClass:
    @staticmethod
    def add(a, b):
        return a + b

result = MyClass.add(1, 2)
print(result)  # 输出:3

classmethod将类本身作为参数传递,并可以访问和修改类属性;它还可以被子类覆盖。staticmethod不接受特殊的第一个参数,不能访问类属性和方法;它通常用于实现与类相关的实用程序功能。

__class__属性

        代表类本身的属性

class MyClass:
    def __new__(cls, *args, **kwargs):
        # 创建一个新的实例
        instance = super().__new__(cls)
        # 可以在这里对实例进行一些初始化操作
        return instance

    def __init__(self):
        print("Initializing the instance")
        cls = self.__class__  # 通常建议用class,提高可维护性和可读性,因为类名可能不固定
        print("Instance belongs to", cls)
        cls = MyClass  
        print("Instance belongs to", cls)

python创建一个类会依次去调用哪些方法

__new__方法__new__方法负责创建类的实例。它是一个静态方法,第一个参数是类本身,通常命名为cls__new__方法通常会调用父类的__new__方法来创建实例,并返回这个实例。

_init__方法__init__方法负责初始化类的实例。它是一个实例方法,第一个参数是实例本身,通常命名为self。在实例创建后,__init__方法会自动被调用。可对实例属性进行初始化和赋值。

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("Creating an instance of", cls)
        instance = super().__new__(cls)
        return instance

    def __init__(self, value):
        print("Initializing the instance")
        self.value = value

# 创建MyClass的实例
my_instance = MyClass(42)
print("Instance value:", my_instance.value)

__new__和__init__实现单例模式的饿汉式和懒汉式

饿汉式

实例在类加载时就被创建。这意味着实例始终存在,无论是否需要。饿汉式的优点是实例创建时线程安全,因为实例是在类加载时创建的,而类加载是线程安全的。缺点是如果实例不需要或很少使用,会浪费资源

class Singleton2:
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)  # 创建类的时候就被创建可返回实例
        return cls._instance

    def __init__(self):
        pass

    @classmethod
    def get_instance(cls):  # 类方法
        return cls.__instance  # 直接返回


# 使用Singleton
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # 输出:True

懒汉式

实例在第一次使用时创建。意味着实例只在需要时创建,可节省资源。懒汉式的缺点是在多线程环境下,需要注意线程安全问题

class Singleton1:
    __instance = None

    @classmethod
    def get_instance(cls):
        if cls.__instance is None:
            __instance = Singleton1()  # 调用获取实例时才去创建
        return cls.__instance


# 使用Singleton
singleton1 = Singleton1()
singleton2 = Singleton1()
print(singleton1 is singleton2)  # 输出:True

确保线程安全,可以使用锁或双重检查锁定机制(懒汉式的PLUS版本)。

import threading

class Singleton:
    _instance = None
    _lock = threading.Lock()

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        pass

# 使用Singleton
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # 输出:True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/920605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML中SCRIPT 标签中的那些属性

在HTML中&#xff0c; <script> 标签用于嵌入或引用JavaScript代码。 在 <script> 标签中&#xff0c;有两个属性可以用来控制脚本的加载和执行方式&#xff1a; async 和 defer 。 当然这也是常见的一道面试题&#xff0c; async 和 defer 的作用和区别。 asy…

【IO流中的字节流(InputStream)(OutputStream)】

字符集 美国人发明计算机 要将他们的字符存入计算机&#xff08;英文字母、数字、标点、特殊字符&#xff09; 给字符进行编号&#xff0c;组成了一张ASCII码表&#xff08;美国信息交换标准代码&#xff09;&#xff0c;一共包含128个字符 该码表以1个字节存储1个字符&#xf…

Java 实现 国密SM4/ECB/PKCS7Padding对称加密解密

Java 实现 国密SM4/ECB/PKCS7Padding对称加密解密&#xff0c;为了演示方便本问使用的是IntelliJ IDEA 2022.1 (Community Edition)来构建代码的 1、pom.xml文件添加需要的jar <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

1002 Business

要解这道题目&#xff0c;感觉最关键的因素就是找到第 件任务最晚开始的时间 。这个看似简单&#xff0c;但是对建模的功底要求相当高。我一开始就把 当成了 &#xff0c;但其实不是的。后者就相当于把第 件任务锁死在最后面完成&#xff0c;但其实是允许放在之前完成的&am…

springboot2+redis 订阅发布,解决接收消息累计线程到内存溢出,使用自定义线程池接收消息

pom 添加redis <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 发布消息 import lombok.extern.slf4j.Slf4j; import o…

FPGA原理与结构——FIFO IP核原理学习

一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写&#xff0c;是一种先入先出的数据缓冲器&#xff0c;与一般的存储器的区别在于没有地址线&#xff0c; 使用起来简单&#xff0c;缺点是只能顺序读写数据&#xff0c;其数据地址由内部读写指针自动加1完成&…

DC电源模块关于输入电压范围

BOSHIDA DC电源模块关于输入电压范围 DC电源模块是一种常用的电源供应设备&#xff0c;其主要作用是将交流电转化为直流电&#xff0c;以供电子设备使用。在DC电源模块的使用过程中&#xff0c;输入电压范围是一个非常重要的参数&#xff0c;它关系到模块的稳定性、可靠性以及…

driver‘s license exam 1

驾考科目1&#xff0c;都是做题目 driver‘s license exam 1_spencer_tseng的博客-CSDN博客 driver‘s license exam 2_spencer_tseng的博客-CSDN博客 driver‘s license exam 3_spencer_tseng的博客-CSDN博客 driver‘s license exam 4_spencer_tseng的博客-CSDN博客 car …

对1GHz脉冲多普勒雷达进行快速和慢速处理生成5个移动目标的距离多普勒图研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

微信公众号关注/取消订阅事件一文详解

一、背景介绍 这周期的项目需求中需要做一个引导用户关注微信公众号的功能&#xff0c;但是引导用户关注的前提是需要实时获取当前用户是否已经关注微信公众号,如果光看官方文档还是对于一些小伙伴来说比较无从下手&#xff0c;所以我来分享以下我做的过程中遇到的问题以及解决…

Ansible 创建分区

实例&#xff1a; 创建一个名为/home/greg/ansible/partition.yml 的剧本&#xff0c;它在所有托管节点上运行&#xff0c;执行以下操作&#xff1a; 在设备 VDB 上创建大小为 1500 MB 的单个主分区 1 使用 ext4 文件系统格式化分区 在/n…

无涯教程-PHP - 性能优化

根据Zend小组的说明,以下插图显示了PHP 7与PHP 5.6和基于流行的基于PHP的应用程序上的HHVM 3.7。 Magento 1.9 与执行Magento事务的PHP 5.6相比&#xff0c;PHP 7的运行速度证明是其两倍。 Drupal 7 在执行Drupal事务时&#xff0c;与PHP 5.6相比&#xff0c;PHP 7的运行速度…

【Gitee提交pr】

Gitee提交pr 什么是pr怎样提交一个pr嘞&#xff1f; 什么是pr pr:指的是将自己的修改从自己的账号仓库dev下提交到官方账号仓库master下&#xff1b; 通俗来讲就是Gitee线上有属于自己的分支&#xff0c;然后本地在自己地分支修改完代码之后&#xff0c;提交到自己的线上分支&a…

十一、hadoop应用

1.上传数据集 27.19.74.143,2015/3/30 17:38,/static/image/common/faq.gif 110.52.250.126,2015/3/30 17:38,/data/cache/style_1_widthauto.css?y7a 27.19.74.143,2015/3/30 17:38,/static/image/common/hot_1.gif 27.19.74.143,2015/3/30 17:38,/static/image/common/hot_2…

【ESP32】启动电流不足——调试问题记录

【ESP32】启动电流不足——调试问题记录 本文主要记录基于esp32 自开发设备硬件调试过程&#xff0c;解决供电不足的问题&#xff0c;用于新手小白记录 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x…

善于打仗的人,创造高势能,行动节奏恰当

善于打仗的人&#xff0c;创造高势能&#xff0c;行动节奏恰当 【安志强趣讲《孙子兵法》第18讲】 【原文】 激水之疾&#xff0c;至于漂石者&#xff0c;势也&#xff1b;鸷鸟之疾&#xff0c;至于毁折者&#xff0c;节也。 【注释】 激&#xff0c;阻截水流 节&#xff0c;时…

SensorService中Binder案例

SensorService中Binder案例 1、FWK实际操作在Native层2、Native层中代码实现Bn/Bp端2.1 代码实现Bn端2.2 代码实现Bp端2.2.1 模板interface_cast android12-release 1、FWK实际操作在Native层 SensorService.java实际操作Native层SensorService.cpp&#xff1b;对应Bn服务端。 …

人机界面通过RJ45口无线连接多台PLC

人机界面是系统和用户之间进行交互和信息交换的媒介&#xff0c;它实现信息的内部形式与人类可以接受形式之间的转换。人机界面产品由硬件和软件两部分组成&#xff0c;硬件部分包括处理器、显示单元、输入单元、通讯接口、数据存贮单元等&#xff0c;HMI软件一般分为两部分&am…

Ensp+Wireshark+VirtualBox+WinPcap

软件下载 [名称]&#xff1a;Ensp及辅助程序 [大小]&#xff1a;830.65MB [语言]&#xff1a;Chinese [安装环境]&#xff1a;Win7/Win8/Win10 [下载链接]&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1KbypgxAGQy07ijSAj3SvsQ 提取码&#xff1a;ly88 软件介…

秋招算法面经集合 | 华为、百度、腾讯、美团等

面试锦囊之面经分享系列&#xff0c;持续更新中 欢迎后台回复"面试"加入讨论组交流噢 写在前面 秋招告一段落&#xff0c;整理文件的时候发现之前记录的面经问题&#xff0c;主要是秋招前期的一些面试&#xff0c;后期由于实习比较忙没花时间整理。希望自己的面经可…