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

Python 魔术方法

1. 什么是魔术方法

在 Python 中,魔术方法(Magic Methods),又叫 特殊方法双下方法,是以两个下划线(__)开头和结尾的方法。

这些方法为 Python 提供了对类和对象的特殊操作功能,它们通常是在特定事件发生时自动调用的。魔术方法允许程序员自定义对象的行为,使得对象能够参与到 Python 内置的操作中(如加法、比较、打印等),这些方法的自动触发和简洁的语法使得 Python 更加灵活和强大。

2. 魔术方法的特点

  1. 自动调用:魔术方法通常在特定操作或事件发生时自动调用。程序员不需要显式地调用这些方法。
  2. 双下划线命名:魔术方法的名称以双下划线(__)开头和结尾。比如:__init____str____add__ 等。
  3. 自定义行为:魔术方法允许程序员定义对象在不同情境下的行为。例如,如何处理加法操作、如何表示对象的字符串输出、如何进行容器类型的索引访问等。

3. 常见的魔术方法

下面介绍 Python 中常见的魔术方法,它们的作用和示例。

  1. __init__(self, ...)

    • 作用__init__ 是 Python 的构造函数,用于初始化对象。当你创建一个对象时,Python 会自动调用这个方法来初始化对象的属性。可以将初始化所需的参数传递给 __init__ 方法。

    • 自动触发:当你实例化(创建)一个对象时,__init__ 方法会被自动调用。

    • 示例

      class MyClass:def __init__(self, name):self.name = nameobj = MyClass("Alice")  # 自动调用 __init__(self, "Alice")
      print(obj.name)  # 输出:Alice
      

      解析:在这个例子中,当创建 MyClass 的实例时,__init__ 方法会自动被调用,name 属性被初始化为 "Alice"

  2. __str__(self)

    • 作用__str__ 定义了对象的字符串表示。当你使用 print() 函数打印一个对象,或者使用 str() 函数时,Python 会自动调用 __str__ 方法。

    • 自动触发:当你打印对象或将对象转换为字符串时,Python 会自动调用 __str__ 方法,返回一个表示对象的字符串。

    • 示例

      class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age} years old"person = Person("Alice", 30)
      print(person)  # 自动调用 __str__,输出 "Alice, 30 years old"
      

      解析:当 print(person) 被执行时,Python 会自动调用 __str__ 方法,返回 "Alice, 30 years old" 字符串作为对象的表示。

  3. __repr__(self)

    • 作用__repr__ 方法用于定义对象的“机器表示”。它应该返回一个字符串,通常这个字符串可以用来重新创建该对象(即能通过 eval() 还原对象)。通常用于调试和开发环境。

    • 自动触发:当你使用 repr() 函数,或者在交互式环境中查看对象时,Python 会自动调用 __repr__ 方法。

    • 示例

      class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person('{self.name}', {self.age})"person = Person("Alice", 30)
      print(repr(person))  # 输出 "Person('Alice', 30)"
      

      解析__repr__ 返回一个可以表示该对象的字符串。在调试时,你可以通过 repr(person) 来查看该对象的内部表示。

  4. __add__(self, other) — 加法运算符重载

    • 作用__add__ 是加法运算符的重载方法,当你使用 + 运算符时,Python 会自动调用 __add__ 方法。

    • 自动触发:当你使用加法运算符(+)对对象进行操作时,__add__ 方法会被自动调用。

    • 示例

      class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Vector(self.x + other.x, self.y + other.y)def __repr__(self):return f"Vector({self.x}, {self.y})"v1 = Vector(1, 2)
      v2 = Vector(3, 4)
      print(v1 + v2)  # 自动调用 __add__,输出 Vector(4, 6)
      

      解析:在这个例子中,当你使用 v1 + v2 时,Python 会自动调用 v1.__add__(v2),返回一个新的 Vector(4, 6) 对象。

  5. __len__(self)

    • 作用__len__ 定义了对象的长度行为,当你调用 len() 函数时,Python 会自动调用 __len__ 方法。

    • 自动触发:当你使用 len() 函数时,__len__ 方法会被自动调用。

    • 示例

      class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)my_list = MyList([1, 2, 3])
      print(len(my_list))  # 自动调用 __len__,输出 3
      

      解析__len__ 方法返回了列表 items 的长度,因此当你调用 len(my_list) 时,Python 会自动调用 my_list.__len__()

  6. __getitem__(self, key) — 获取元素

    • 作用__getitem__ 用于定义对象的索引行为。当你通过 obj[key] 访问对象时,Python 会自动调用 __getitem__ 方法。

    • 自动触发:当你使用索引语法([])来访问对象时,Python 会自动调用 __getitem__ 方法。

    • 示例

      class MyList:def __init__(self, items):self.items = itemsdef __getitem__(self, index):return self.items[index]my_list = MyList([10, 20, 30])
      print(my_list[1])  # 自动调用 __getitem__(1),输出 20
      

      解析:通过 my_list[1] 访问时,Python 自动调用 my_list.__getitem__(1),返回索引位置为 1 的值 20

  7. __setitem__(self, key, value)

    • 作用__setitem__ 用于定义对象的索引赋值行为,当你通过 obj[key] = value 赋值时,Python 会自动调用 __setitem__ 方法。

    • 自动触发:当你使用索引赋值([] =)语法时,Python 会自动调用 __setitem__ 方法。

    • 示例

      class MyList:def __init__(self, items):self.items = itemsdef __setitem__(self, index, value):self.items[index] = valuemy_list = MyList([10, 20, 30])
      my_list[1] = 50  # 自动调用 __setitem__(1, 50)
      print(my_list.items)  # 输出 [10, 50, 30]
      

      解析:通过 my_list[1] = 50 赋值时,Python 自动调用 my_list.__setitem__(1, 50),更新索引 1 处的值为 50。

相关文章:

Python 魔术方法

1. 什么是魔术方法 在 Python 中,魔术方法(Magic Methods),又叫 特殊方法 或 双下方法,是以两个下划线(__)开头和结尾的方法。 这些方法为 Python 提供了对类和对象的特殊操作功能&#xff0c…...

websocket webworker教程及应用

WebSocket 和 Web Workers 是两种不同的 Web 技术,分别用于实现实时通信和后台线程处理。以下是它们的简要教程: WebSocket 教程 1. 什么是 WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务器主动向客户端推…...

qwen2.5-vl:阿里开源超强多模态大模型(包含使用方法、微调方法介绍)

1.简介 在 Qwen2-VL 发布后的五个月里,众多开发者基于该视觉语言模型开发了新的模型,并向 Qwen 团队提供了极具价值的反馈。在此期间,Qwen 团队始终致力于打造更具实用性的视觉语言模型。今天,Qwen 家族的最新成员——Qwen2.5-VL…...

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹,寻…...

Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)

Java 基于 springboot 的校园选课小程序 博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇&…...

网络工程师 (7)进程管理

一、进程相关的概念 (一)定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也是操作系统结构的基础。进程是程序的一次执行实例,具有动…...

大屏 UI 设计风格的未来趋势

在科技飞速革新的时代,大屏设备的应用领域不断拓展,从城市的智能交通指挥中心,到商场的互动广告大屏,再到家庭的超大尺寸智能电视,大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变,…...

Kmesh v1.0 正式发布

2025 年 1 月 23 日,Kmesh 团队正式发布了 Kmesh v1.0235。Kmesh 作为一款开源的服务网格解决方案,v1.0 版本在网络流量管理领域引入了多项重磅特性2。具体如下134: IPsec 加密通信:引入 IPsec 加密协议,将节点间流量加…...

低代码系统-产品架构案例介绍、轻流(九)

轻流低代码产品定位为零代码产品,试图通过搭建来降低企业成本,提升业务上线效率。 依旧是从下至上,从左至右的顺序 名词概述运维层底层系统运维层,例如上线、部署等基础服务体系内置的系统能力,发消息、组织和权限是必…...

深入理解动态规划(dp)--(提前要对dfs有了解)

前言:对于动态规划:该算法思维是在dfs基础上演化发展来的,所以我不想讲的是看到一个题怎样直接用动态规划来解决,而是说先用dfs搜索,一步步优化,这个过程叫做动态规划。(该文章教你怎样一步步的…...

C++传送锚点的内存寻址:内存管理

文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...

webAPI -DOM 相关知识点总结(非常细)

title: WebAPI语法 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端WEB API 了解DOM的结构并掌握其基本的操作,体验 DOM 在开发中的作用 API简介 就是使用js来操作html和浏览器 什么是DOM? 就是一个文档对象模型,是用来呈现预计于任意htm…...

Deepseek的RL算法GRPO解读

在本文中,我们将深入探讨Deepseek采用的策略优化方法GRPO,并顺带介绍一些强化学习(Reinforcement Learning, RL)的基础知识,包括PPO等关键概念。 策略函数(policy) 在强化学习中, a…...

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解策略模式 在策略模式中,可以定义一些独立的类来封装不同的算法,每个类封装一种具体的算法。在这里,每个封装算法的类都可以称之为一种策略(Strategy…...

MyBatis 写法

MyBatis 高效使用技巧 常见 MyBatis 使用技巧,这些技巧有助于简化数据库操作,提高开发效率,并增强系统的性能。 1. 动态 SQL 动态 SQL 让开发者能够依据参数灵活地构建 SQL 语句,避免了手动拼接字符串带来的复杂性和错误风险。…...

Git图形化工具【lazygit】

简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…...

K8s运维管理平台 - xkube体验:功能较多

目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…...

5.3.1 软件设计的基本任务

文章目录 软件设计解决的问题概要设计基本任务详细设计基本任务 软件设计解决的问题 需求分析解决“做什么”的问题,软件设计解决“如何做”的问题。软件设计分为概要设计、详细设计两块。概要设计是设计软件和数据的总体框架,比详细设计的颗粒度更大。详…...

Go学习:字符、字符串需注意的点

Go语言与C/C语言编程有很多相似之处,但是Go语言中在声明一个字符时,数据类型与其他语言声明一个字符数据时有一点不同之处。通常,字符的数据类型为 char,例如 :声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...

LabVIEW无线齿轮监测系统

本案例介绍了基于LabVIEW的无线齿轮监测系统设计。该系统利用LabVIEW编程语言和改进的天牛须算法优化支持向量机,实现了无线齿轮故障监测。通过LabVIEW软件和相关硬件,可以实现对齿轮箱振动信号的采集、传输和故障识别,集远程采集、数据库存储…...

基于SpringBoot的租房管理系统(含论文)

基于SpringBoot的租房管理系统是一个集订单管理、房源信息管理、屋主申诉处理、用户反馈等多项功能于一体的系统。该系统通过SpringBoot框架开发,拥有完善的管理员后台、屋主管理模块、用户功能模块等,适用于房地产租赁平台或中介公司进行日常管理与运营…...

剑指 Offer II 008. 和大于等于 target 的最短子数组

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20008.%20%E5%92%8C%E5%A4%A7%E4%BA%8E%E7%AD%89%E4%BA%8E%20target%20%E7%9A%84%E6%9C%80%E7%9F%AD%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 008.…...

【微服务与分布式实践】探索 Eureka

服务注册中心 心跳检测机制:剔除失效服务自我保护机制 统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期。当节点在短时间内丢失过多的心跳时&am…...

关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题

方法一:利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件,找到C:\Windows\System32文件夹(注意一定是C盘)黏贴至该文件夹重新打开VS。 方法二:直接配置环境 打开opencv文…...

重构字符串(767)

767. 重构字符串 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:string reorganizeString(string s){string res;//因为1 < s.length < 500 &#xff0c; uint64_t 类型足够uint16_t n s.size();if (n 0) {return res;}unordere…...

【MQ】如何保证消息队列的高性能?

零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件&#xff0c;基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…...

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…...

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

面向对象设计(大三上)--往年试卷题+答案

目录 1. UML以及相关概念 1.1 动态图&静态图 1.2 交互图 1.3 序列图 1.4 类图以及关联关系 1.4.1类图 1.4.2 关系类型 (1) 用例图中的包含、扩展关系(include & extend) (2) 类图中的聚合、组合关系(aggragation & composition) 1.5 图对象以及职责划…...

Java基础知识总结(二十四)--Collections

它的出现给集合操作提供了更多的功能。这个类不需要创建对象&#xff0c;内部提供的都是静态方法。 静态方法&#xff1a; Collections.sort(list);//list集合进行元素的自然顺序排序。 Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。 class Co…...

大语言模型的API接口如何操作

选择大语言模型 根据自身需求和应用场景选择合适的大语言模型&#xff0c;如 OpenAI 的 GPT 系列、百度的文心一言、智谱的 GLM 等。需要考虑模型的性能、功能特点、适用领域、成本等因素。 获取 API 密钥和凭证 注册账号&#xff1a;访问所选大语言模型的官方平台或相关开发…...

【漫话机器学习系列】067.希腊字母(greek letters)-写法、名称、读法和常见用途

希腊字母&#xff08;Greek Letters&#xff09; 希腊字母在数学、科学、工程学和编程中广泛使用&#xff0c;常用于表示变量、常量、参数、角度等。以下是希腊字母的完整列表及其常见用途。 大写与小写希腊字母表 大写小写名称&#xff08;英文&#xff09;名称&#xff08;…...

Kotlin判空辅助工具

1&#xff09;?.操作符 //执行逻辑 if (person ! null) {person.doSomething() } //表达式 person?.doSomething() 2&#xff09;?:操作符 //执行逻辑 val c if (a ! null) {a } else {b } //表达式 val c a ?: b 3&#xff09;!!表达式 var message: String? &qu…...

【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换

分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...

深入理解指针(2)

数组名的理解 什么是数组名&#xff1f;在计算机编程中&#xff0c;数组名是用于标识一个数组的名称。那应当如何来理解数组名呢&#xff1f;事实上&#xff0c;在数组中数组名就是数组首元素的地址。 示例1&#xff1a; #include<stdio.h> int main() {int arr[10] …...

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…...

计算机网络之计算机网络主要性能

一、速率与带宽 速率&#xff1a; 定义&#xff1a;数据的传送速率&#xff0c;也称数据率或比特率&#xff0c;表示单位时间内传输的比特数。 单位&#xff1a;比特/秒&#xff08;bit/s&#xff09;&#xff0c;常用单位有千比特/秒&#xff08;kb/s&#xff09;、兆比特/秒…...

家居 EDI:Haverty‘s EDI 需求分析

Havertys 成立于 1885 年&#xff0c;是一家历史悠久的美国家具零售商。公司致力于为客户提供高品质的家具和家居饰品&#xff0c;其产品线涵盖客厅、卧室、餐厅及办公家具等多个领域。 电子数据交换&#xff08;EDI&#xff09;是一种通过标准化电子格式在商业伙伴之间进行数据…...

JavaScript - Web APIs(上)

Web API 介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff0c;ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的。浏览器将 ECM…...

【漫话机器学习系列】068.网格搜索(GridSearch)

网格搜索&#xff08;Grid Search&#xff09; 网格搜索&#xff08;Grid Search&#xff09;是一种用于优化机器学习模型超参数的技术。它通过系统地遍历给定的参数组合&#xff0c;找出使模型性能达到最优的参数配置。 网格搜索的核心思想 定义参数网格 创建一个包含超参数值…...

MySQL 的索引类型【图文并茂】

基本分类 文本生成MindMap:https://app.pollyoyo.com/planttext <style> mindmapDiagram {node {BackgroundColor yellow}:depth(0) {BackGroundColor SkyBlue}:depth(1) {BackGroundColor lightGreen} } </style> * MySQL 索引** 数据结构角度 *** B树索引*** 哈…...

OSCP:发送钓鱼电子邮件执行客户端攻击

概述 在渗透测试领域&#xff0c;钓鱼攻击是一种有效的客户端攻击手段&#xff0c;尤其在目标用户缺乏安全意识或系统存在未修复漏洞时&#xff0c;成功率较高。针对Windows平台&#xff0c;滥用Windows库文件&#xff08;.Library-ms&#xff09;是一种技术性较强但易于实施的…...

Oracle 普通用户连接hang住处理方法

一、现象说明 $ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Wed Dec 18 16:49:19 2024 Version 19.11.0.0.0Copyright (c) 1982, 2020, Oracle. All rights reserved.Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Pro…...

C++ ——— 学习并使用 priority_queue 类

目录 何为 priority_queue 类 学习并使用 priority_queue 类 实例化一个 priority_queue 类对象 插入数据 遍历堆&#xff08;默认是大堆&#xff09; 通过改变实例化的模板参数修改为小堆 何为 priority_queue 类 priority_queue 类为 优先级队列&#xff0c;其本质就是…...

JVM--类加载器

概念 类加载器&#xff1a;只参与加载过程中的字节码获取并加载到内存中的部分&#xff1b;java虚拟机提供给应用程序去实现获取类和接口字节码数据的一种技术&#xff0c;也就是说java虚拟机是允许程序员写代码去获取字节码信息 类加载是加载的第一步&#xff0c;主要有以下三…...

【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)

文章目录 一、日期类的实现1. 日期类的默认成员函数的分析与实现构造函数其它默认成员函数 2. 各种逻辑比较运算符重载3. 日期加与减天数日期加天数系列日期减天数系列日期加减天数的最后修定和- -系列 4. 日期减日期方法一方法二 5. 流插入与流提取重载流插入重载流提取重载(含…...

ROS应用之SwarmSim在ROS 中的协同路径规划

SwarmSim 在 ROS 中的协同路径规划 前言 在多机器人系统&#xff08;Multi-Robot Systems, MRS&#xff09;中&#xff0c;SwarmSim 是一个常用的模拟工具&#xff0c;可以对多机器人进行仿真以实现复杂任务的协同。除了任务分配逻辑以外&#xff0c;SwarmSim 在协同路径规划方…...

Shell特殊位置变量以及常用内置变量总结

目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…...

【ollama通过命令行启动后如何在网页端查看运行】

ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...