当前位置: 首页 > news >正文

Python Cookbook-6.9 快速复制对象

任务

为了使用 copy.copy,需要实现特殊方法__copy__。而且你的类的__init__比较耗时所以你希望能够绕过它并获得一个“空的”未初始化的类实例。

解决方案

下面的解决方案可同时适用于新风格和经典类:

def empty_copy(obj):class Empty(obj.__class__):def __init__(self):passnewcopy = Empty()newcopy.__class__ = obj.__class__return newcopy

你的类可以使用这个函数来实现__copy__:

class YourClass(object):def __init__(self):assume there's a lot of work heredef __copy__(self):newcopy = empty_copy(self)copy some relevant subset of self's attributes to newcopyreturn newcopy

下面是用法示例:

if __name__ == '__main__':import copyy = YourClass()#很显然,__init__会被调用print z = copy.copy(y)y#…不调用__init__print z

讨论

如同 4.1节的讨论,当你进行赋值操作时,Python 并不会暗中对对象进行复制操作,这是一个很好的处理,因为这样的机制更快、更灵活,而且也具有语义的一致性。当需要复制时,要明确地提出请求,通常使用 copy.copy 函数,它知道怎样复制内建的类型,对于自定义的对象也具有默认的行为方式,如果你想定制这个复制过程,可以定义类的__copy__特殊方法。如果你的类实例是不允许复制的,可以定义一个__copy__并抛出一个 TypeError 异常。大多数情况下,你只需要让 copy.copy 按照默认的机制工作就可以很轻松地获得克隆能力。这确实是很棒的设计,其他很多语言会强迫你实现个特殊的 clone 方法来完成实例克隆。

如果__init__是一个耗时的操作,copy__常常需要以一个“空”实例开始,从而绕开__init。最简单和通用的方法是使用Python 提供的直接修改实例的类的能力:在本地的空类中创建一个新对象,然后设置此对象的class属性,如代码所示。对旧风格(经典)类而言,从obj.class__继承 Empty 类显得比较多余(但也没什么害处)但继承机制使得本节的方案对于各种对象包括经典的和新风格的类(包括内建的和扩展类型),都具有很好的兼容性。一旦你选择从ob的类继承,必须重写 Empty 类中的__init,否则就无法实现本节方案的初衷。重写,意味着obj类的__init__不会被执行,这是因为在 Python 中,父类的初始化方法并不会自动执行。

一旦得到了一个符合要求的类的“空”对象,就需要复制 self 属性的一个子集。当需要所有属性时,最好就不要自定义__copy__,因为copy.copy 的默认行为就是复制实例的所有属性。除非你除了复制所有属性之外还想做更多的工作,在本例中,下面两种复制所有属性的方式都是可行的:

newcopy.__dict__.update(self.__dict__)
newcopy.__dict__ = dict(self.__dict__)

新风格类的实例并不一定会在__dict__中保存它的所有状态,所以你可能需要复制一些与类相关特定的状态。

基于标准模块 new 的方式对于经典类和新风格类无法做到完全透明,而且new静态方法也不能生成一个空的实例——后者只在新风格类中存在。不过,本节的方案能够解决这些问题。

实现__copy__的一种好的替代方式是实现__getstate__和__setstate__方法:这些特殊方法以明确的和原生的方式定义了你的对象的状态,绕过了__init__。另外,它们也支持类实例的序列化:见7.4节中关于这些方法的更多信息。

到此为止我们讨论的是浅拷贝,这也是你大多数时候需要的复制方式。使用浅拷贝时虽然你的对象被复制了,但是它指向的很多对象(内部的属性或者子项)却并未被复制,所以新复制的对象和原对象指向相同的属性和子项–这是一种轻量级的快速操作。而深拷贝则是一种重量级的深度操作,它根据对象的指向图谱逐一地完成对所有对象的拷贝。可以调用 copy.deepcopy 完成对一个对象的深拷贝。如果你想定制你的类实例的深拷贝方式,需要定义一个特殊方法__deepcopy__:

class YourClass(object):'''def __deepcopy__(self,memo):newcopy = empty_copy(self)#使用copy.deepcopy(self.x,memo)来获得self的相关属性#元素的子集的深拷贝,并放入newcopy中。return newcopy

如果决定要实现__deepcopy__,记住要遵守Python 标准库模块 copy 的文档定义的memoization 协议——应该复制有第二个参数的 copy.deepcopy要求的全部属性和子项同一个memo字典,还会被传递给__deepcopy__方法。另外,实现__getstate__和__setstate__也是很好的选择,因为这些方法同样支持深拷贝:Python 会处理并复制那些由__getstate__ 返回的“状态”对象,然后传递给一个新的,空实例的__setstate__方法。参看7.4 节关于这些特殊方法的更多内容。

相关文章:

Python Cookbook-6.9 快速复制对象

任务 为了使用 copy.copy,需要实现特殊方法__copy__。而且你的类的__init__比较耗时所以你希望能够绕过它并获得一个“空的”未初始化的类实例。 解决方案 下面的解决方案可同时适用于新风格和经典类: def empty_copy(obj):class Empty(obj.__class__):def __in…...

Linux NIO 原理深度解析:从内核到应用的高性能 I/O 之道

Linux 的 ​非阻塞 I/O(Non-blocking I/O,NIO)​​ 是构建高性能服务器的核心技术,其核心思想是通过 ​事件驱动模型​ 和 ​零拷贝技术​ 实现高并发、低延迟的网络通信。以下从底层机制到实际应用进行全面剖析。 一、Linux I/O …...

Redis 集群切片全解析:四种常见技术的原理、优劣与应用

Redis 集群切片是将数据分散存储在多个 Redis 节点上的技术,以提高系统的可扩展性和性能。以下是一些常见的 Redis 集群切片方式: 1.哈希切片 原理:通过对数据的键进行哈希运算,将哈希值映射到不同的切片(槽&#xf…...

html中margin的用法

在 HTML 页面布局中,margin 是 CSS 中用于设置 元素与元素之间的外边距(即元素外部的空白区域) 的属性。 它可以单独设置四个方向的边距:上(top)、右(right)、下(bottom…...

网络流量分析 | 流量分析基础

流量分析是网络安全领域的一个子领域,其主要重点是调查网络数据,以发现问题和异常情况。本文将涵盖网络安全和流量分析的基础知识。 网络安全与网络中的数据 网络安全的两个最关键概念就是:认证(Authentication)和授…...

语音合成之六端到端TTS模型的演进

端到端TTS模型的演进 引言Tacotron:奠基之作FastSpeech:解决效率瓶颈VITS:实现高保真和富有表现力的语音SparkTTS:利用LLM实现高效可控的TTSCosyvoice:一种可扩展的多语种TTS方法端到端TTS模型的演进与未来方向 引言 …...

文件的读取操作

#import time # 导入time 库 # 打开文件 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8")# 读取文件 print(f"读取文件的所有内容内容:{file.read()}\n") #\n是换行字符 print(f"读取10个字节的文件内容:{file.re…...

【Linux学习笔记】进程的fork创建 exit终止 wait等待

【Linux学习笔记】进程的fork创建 exit终止 wait等待 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】进程的fork创建 exit终止 wait等待前言1.进程创建1.1 fork函数初识1.2fork函数返回值1.3写时拷…...

一种专用车辆智能配电模块的设计解析:技术革新与未来展望

关键词:智能配电模块、STM32、CAN总线、电子开关、新能源汽车 引言:传统配电系统的痛点与智能化转型 传统配电系统依赖继电器和保险丝,存在体积大、寿命短、智能化低等缺陷(如图1)。而新能源汽车和无人驾驶技术对配电…...

第TR5周:Transformer实战:文本分类

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.准备工作 1.1.加载数据 import torch import torch.nn as nn import torchvision import os,PIL,warnings import pandas as pd warnings.filterwarnings…...

Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用

目录 一、背景与重要性‌二、CSS选择器基础与分类‌2.1 什么是选择器?‌2.2 选择器分类与语法‌ 三、核心选择器详解与实战案例‌3.1 基础选择器:精准定位元素‌3.2 组合选择器:元素关系控制‌3.3 伪类与伪元素:动态与虚拟元素‌3…...

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位: 1 ^{1} 1乔治梅森大学计算机科学系, 2 ^{2} 2美国陆军研究实验室&…...

ROS 快速入门教程04

12.激光雷达工作原理 激光雷达的作用是探照周围障碍物的距离,按照测量维度可以分为单线雷达和多线雷达。 按照测量原理可以分为三角测距雷达和TOF雷达。按照工作方式可以分为固态雷达和机械旋转雷达。 本次讲解以TOF雷达为例,雷达发射器发射激光遇到障碍…...

Node.js 开发项目

初始化 npm init## npm install 编辑packege.json 添加,以支持ES6的语法 "type": "module" 连接mysql示例 import db from ./db/ops_mysql.jsconst createTable async () > {const insert_data CREATE TABLE IF NOT EXISTS users (…...

Linux系统下的常用网络命令

1.ping命令 作用:用来检测网络的连通情况和分析网络速度;根据域名得到服务器IP;根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。 参数:-c 数字:设定ping命令发出的消息包数量,如无…...

【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?

一、IGBT 是什么?重新认识这个 “低调的电力心脏” 你可能没听过 IGBT,但一定用过它驱动的设备:家里的变频空调、路上的电动汽车、屋顶的光伏逆变器,甚至高铁和电网的核心部件里,都藏着这个 “电力电子开关的瑞士军刀”…...

C++23 新特性深度落地与最佳实践

一、引言 C 作为一门历史悠久且广泛应用的编程语言,一直在不断发展和演进。C23 作为 C 标准的一个重要版本,引入了许多令人期待的新特性,这些特性不仅提升了代码的可读性、可维护性,还增强了程序的性能和安全性。本文将深入探讨 …...

26考研 | 王道 | 数据结构笔记博客总结

26考研 | 王道 | 数据结构笔记博客总结 笔者博客网站 分类: 数据结构 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第一章 数据结构绪论 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第二章 线性表 | Darlingの妙妙屋 26考研 | 王道 | 数据结构 | 第三章 栈和队列 |…...

Bolsig+超详细使用教程

文章目录 Bolsig介绍Bolsig的使用 Bolsig介绍 BOLSIG 是一款用于求解弱电离气体中电子玻尔兹曼方程的免费计算程序,适用于均匀电场条件下的群体实验、气体放电及碰撞型低温等离子体研究。在此类环境中,电子分布函数呈现非麦克斯韦特性,其形态…...

基于线性LDA算法对鸢尾花数据集进行分类

基于线性LDA算法对鸢尾花数据集进行分类 1、效果 2、流程 1、加载数据集 2、划分训练集、测试集 3、创建模型 4、训练模型 5、使用LDA算法 6、画图3、示例代码 # 基于线性LDA算法对鸢尾花数据集进行分类# 基于线性LDA算法对鸢尾花数据集进行分类 import numpy as np import …...

C#高级语法--接口

先引用一些通俗一点的话语说明 1. 接口就像“插座标准”(解耦) 🧩 场景: 你家的手机充电器(USB-C、Lightning)必须插进匹配的插座才能充电。问题:如果每个手机品牌插座都不一样,你换手机就得换充电器,太麻烦了!💡 接口的作用: 定义一个通用的充电口标准(比如U…...

软测面经(私)

测试流程 分析需求——>制定测试计划——>设计测试用例——>执行测试——>编写测试报告 黑盒测试 等价类划分、边界值分析法、猜错法、随机数法、因果图。 白盒测试 代码检查法、程序变异、静态结构分析法、静态质量度量法、符号测试法、逻辑覆盖法、域测试、…...

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…...

数据结构初阶:排序

概述&#xff1a;本篇博客主要介绍关于排序的算法。 目录 1.排序概念及应用 1.1 概念 1.2 运用 1.3 常见的排序算法 2. 实现常见排序算法 2.1 插入排序 2.1.1 直接插入排序 2.1.2 希尔排序 2.2 选择排序 2.2.1 直接选择排序 2.2.2 堆排序 2.3 交换排序 2.3.1 冒泡排序…...

openwrt查询网关的命令

方法一&#xff1a;route -n 方法二&#xff1a;ip route show...

优化非线性复杂系统的参数

非线性项组合的系统 对于系统中的每一个复杂拟合&#xff0c;即每一个残差函数&#xff0c;都能表示为非线性方程的趋势&#xff0c;例如较为复杂的系统函数组&#xff0c; from optimtool.base import sp, np x sp.symbols("x1:5") res1 0.5*x[0] 0.2*x[1] 1.…...

【QQMusic项目界面开发复习笔记】第二章

&#x1f339; 作者: 云小逸 &#x1f91f; 个人主页: 云小逸的主页 &#x1f91f; motto: 要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前&#xff0c;其次就是现在&…...

并发编程【深度解剖】

并发介绍 谈到并发&#xff0c;随之而来的就是那几个问题。并发 并行 线程 进程 注意&#xff01;&#xff01;&#xff01;本篇文章更多用诙谐的语调讲解&#xff0c;为保证易于理解&#xff0c;不够官方正式&#xff0c;所以可以结合AI读本篇文章&#xff0c;并且本文是以 g…...

前端如何连接tcp 服务,接收数据

在传统的浏览器前端环境中&#xff0c;由于浏览器的同源策略和安全限制&#xff0c;无法直接建立 TCP 连接。不过&#xff0c;可以通过 WebSocket 或者使用 WebRTC 来间接实现与 TCP 服务的通信&#xff0c;另外在 Node.js 环境中可以直接使用 net 模块建立 TCP 连接。下面分别…...

用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。

一、思路概要和知识回顾 1.思路概要 ①中缀表达式计算&#xff1a; 需要处理运算符的优先级&#xff0c;可能需要用到栈结构。 ❗❗如何将中缀表达式转换为后缀表达式&#xff1f;或者直接计算&#xff1f; 通常&#xff0c;中缀转后缀&#xff08;逆波兰式&#xff09;再…...

使用 Pandas 进行多格式数据整合:从 Excel、JSON 到 HTML 的处理实战

前言 在数据处理与分析的实际场景中&#xff0c;我们经常需要整合不同格式的数据&#xff0c;例如 Excel 表格、JSON 配置文件、HTML 报表等。本文以一个具体任务&#xff08;蓝桥杯模拟练习题&#xff09;为例&#xff0c;详细讲解如何使用 Python 的 Pandas 库结合其他工具&…...

常见游戏引擎介绍与对比

Unreal Engine (UE4/UE5) 主语言&#xff1a;C Unreal Engine 主要使用 C 作为开发语言。C 提供了高性能的底层控制&#xff0c;适用于需要精细调优的 AAA 级游戏。C 在 Unreal 中用于开发核心游戏逻辑、物理引擎等性能要求较高的部分。 脚本语言&#xff1a;蓝图&#xff08;B…...

第十一天 主菜单/设置界面 过场动画(Timeline) 成就系统(Steam/本地) 多语言支持

前言 对于刚接触Unity的新手开发者来说&#xff0c;构建完整的游戏系统往往充满挑战。本文将手把手教你实现游戏开发中最常见的四大核心系统&#xff1a;主菜单界面、过场动画、成就系统和多语言支持。每个模块都将结合完整代码示例&#xff0c;使用Unity 2022 LTS版本进行演示…...

vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包

场景&#xff1a; 之前写过一篇 vite vue2 的配置&#xff0c;但是现在项目使用 vue3 较多&#xff0c;再更新一下 vue脚手架初始化之后的项目&#xff0c;每个项目都是独立的&#xff0c;导致项目多了之后&#xff0c;node依赖包过多&#xff0c;占用内存较多。想实现的效果…...

k8s(9) — zookeeper集群部署(亲和性、污点与容忍测试)

一、部署思路 1、前期设想 zookeeper集群至少需要运行3个pod集群才能够正常运行&#xff0c;考虑到节点会有故障的风险这个3个pod最好分别运行在&#xff13;个不同的节点上(为了实现这一需要用到亲和性和反亲和性概念)&#xff0c;在部署的时候对zookeeper运行的pod打标签加…...

Linux操作系统复习

Linux操作系统复习 一. Linux的权限和shell原理1. Linux从广义上讲是什么 从狭义上讲是什么&#xff1f;2. shell是什么&#xff1f;3. 为什么要设置一个shell外壳而不是直接和linux 内核沟通4. shell的原理是什么5. Linux中权限的概念6. 如何提升当前操作的权限7. 文件访问者的…...

深入解析 Linux 中动静态库的加载机制:从原理到实践

引言 在 Linux 开发中&#xff0c;动静态库是代码复用的核心工具。静态库&#xff08;.a&#xff09;和动态库&#xff08;.so&#xff09;的加载方式差异显著&#xff0c;直接影响程序的性能、灵活性和维护性。本文将深入剖析两者的加载机制&#xff0c;结合实例演示和底层原…...

总账主数据——Part 2 科目-1

本文主要介绍在S4 HANA OP中 总账主数据的后台配置及前台操作。 目录 1. 准备 1.1 科目表的定义(OB13) 1.2 给公司代码分配科目表(OB62) 1.3 定义科目组(OBD4) 1.4 定义留存收益科目(OB53) 1.5 维护科目表层“文本标识” (OBT6) 1.6 维护公司代码层“文本标识” (OBT…...

借助内核逻辑锁pagecache到内存

一、背景 内存管理是一个永恒的主题&#xff0c;尤其在内存紧张触发内存回收的时候。系统在通过磁盘获取磁盘上的文件的内容时&#xff0c;若不开启O_DIRECT方式进行读写&#xff0c;磁盘上的任何东西都会被缓存到系统里&#xff0c;我们称之为page cache。可以想象&#xff0…...

✨ Apifox:这玩意儿是接口界的“瑞士军刀”吧![特殊字符][特殊字符]

——全网最皮最全测评&#xff0c;打工人看了直呼“真香” &#x1f4e2; 友情提醒 还在用 Postman 测接口、Swagger 写文档、Mock.js 造假数据、脑细胞搞团队协作&#xff1f; 停&#xff01; 你仿佛在玩《工具人环游记》&#xff0c;而隔壁同事已经用 Apifox 「一杆清台」了…...

《普通逻辑》学习记录——性质命题及其推理

目录 一、性质命题概述 二、性质命题的种类 2.1、性质命题按质的分类 2.2、性质命题按量的分类 2.3、性质命题按质和量结合的分类 2.4、性质命题的基本形式归纳 三、四种命题的真假关系 3.1、性质命题与对象关系 3.2、四种命题的真假判定 3.3、四种命题的对当关系 四、四种命题…...

设备接入与APP(应用程序)接入华为云iotDA平台的路径元素有哪些不同?

目录 壹、设备接入华为云iotDA &#x1f3e2; 形象比喻&#xff1a;设备 员工&#xff0c;IoTDA 平台 安保森严的总部大楼 一、&#x1f4cd; 平台接入地址 总部大楼地址 二、&#x1f9fe; 接入凭证 出入证 / 门禁卡 / 工牌 1. 设备密钥或证书 2. 预置接入凭证密钥&a…...

【git#4】分支管理 -- 知识补充

一、bug 分支 假如我们现在正在 dev2 分支上进行开发&#xff0c;开发到一半&#xff0c;突然发现 master 分支上面有 bug&#xff0c;需要解决。 在Git中&#xff0c;每个 bug 都可以通过一个新的临时分支来修复&#xff0c;修复后&#xff0c;合并分支&#xff0c;然后将临…...

AXOP34062: 40V双通道运算放大器

AXOP34062是一款通用型高压双通道运算放大器&#xff0c;产品的工作电压为2.5V至40V&#xff0c;具有25MHz的带宽&#xff0c;压摆率为10V/μs&#xff0c;静态电流为650A。较高的耐压和带宽使其可以胜任绝大多数的高压应用场景。 主要特性 轨到轨的输入输出范围低输入失调电…...

OpenCv高阶(十)——光流估计

文章目录 前言一、光流估计二、使用步骤1、导库读取视频、随机初始化颜色2、初始化光流跟踪3、视频帧处理循环4、光流计算与可视化5、循环控制与资源释放完整代码 总结 前言 在计算机视觉领域&#xff0c;光流估计是捕捉图像序列中像素点运动信息的核心技术。它描述了图像中每…...

BS客户端的单点登录

1、参数类似于“XXXXX://?userIdsystem&time1696830378038&token38a8ea526537766f01ded33a6cdfa5bd” 2、在config里加一个LoginSecret参数可随意指定一个字符串 3、BS登录代码里会对“LoginSecret的参数值用户ID时间戳”进行MD5加密形成token&#xff0c;与传过来的…...

通讯录完善版本(详细讲解+源码)

目录 前言 一、使通讯可以动态更新内存 1、contact.h 2、contact.c 存信息&#xff1a; 删除联系人&#xff0c;并试一个不存在的人的信息&#xff0c;看看会不会把其他人删了 ​编辑 修改&#xff1a; ​编辑 排序&#xff1a; ​编辑 销毁&#xff1a; ​编辑 ​…...

第3讲:ggplot2完美入门与美化细节打磨——从基础绘制到专业级润色

目录 1. 为什么选择ggplot2? 2. 快速了解ggplot2绘图核心逻辑 3. 基础绘图示范:柱状图、折线图、散点图 (1)简单柱状图 (2)折线图示范 (3)高级散点图 + 拟合线 4. 精细美化:细节打磨决定专业感 5. 推荐的美化小插件(可选进阶) 6. 小练习:快速上手一幅美化…...

带宽?增益带宽积?压摆率?

一、带宽&#xff08;Bandwidth&#xff09; 1.科学定义&#xff1a; 带宽指信号或系统能够有效通过的频率范围&#xff0c;通常定义为信号功率下降到中频值的一半&#xff08;即 - 3dB&#xff09;时的最高频率与最低频率之差。对于运算放大器&#xff08;Op-Amp&#xff09…...

为什么栈内存比堆内存速度快?

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1…...