Python中魔术方法汇总

文章目录

      • 1. Python中魔术方法的定义
      • 2. 魔术方法的分类
        • 2.1面向对象特性的增强:
        • 2.2运算符重载:
        • 2.3语义化编程:
        • 2.4控制对象生命周期:
        • 2.5容器协议支持:
        • 2.6 上下文管理器协议:
        • 2.7简化API设计:
      • 3. 部分常用的魔术方法代码实例
        • 3.1 初始化与销毁:
        • 3.2 对象表示:
        • 3.3 运算符重载:
        • 3.4 容器协议:

1. Python中魔术方法的定义

Python的魔术方法(Magic Methods)是面向对象编程中一系列特殊的方法,它们以双下划线__开始和结束。这些方法允许类定义特定的行为或响应特定的操作。以下是一份详细的魔术方法列表及其用途并附带部分常用魔术方法的Python代码实例说明:

2. 魔术方法的分类

Python中引入魔术方法(Magic Methods)的好处主要包括:

2.1面向对象特性的增强:

魔术方法允许程序员自定义类的行为,使其更接近内建类型。例如,通过重写__str__方法可以使自定义类的对象在打印时显示用户友好的字符串;通过实现__eq____hash__方法可以控制对象的相等性比较和哈希值计算。

2.2运算符重载:

Python中的魔术方法提供了对操作符重载的支持,如加法、减法、乘法等。通过实现诸如__add____sub__等方法,可以让自定义类的对象支持与内建类型的相同运算符,从而实现类似“+”、“-”、“*”这样的操作符在不同类实例之间的混合使用。

2.3语义化编程:

魔术方法使得程序代码更加语义化,比如通过__call__方法可以让一个类实例像函数一样被调用,这有助于提高代码可读性和直观性。

2.4控制对象生命周期:

通过__new__方法可以控制新对象创建的过程,包括何时以及如何分配内存空间;__init__方法用于初始化新创建的对象;而__del__方法则在对象被销毁时执行清理操作。

2.5容器协议支持:

魔术方法使得自定义类能够遵循Python的容器协议,如列表、字典等,从而支持索引、切片、迭代等功能。例如,通过实现__getitem____setitem____len__等方法,可以让自定义类表现得如同列表或字典一样。

2.6 上下文管理器协议:

使用__enter____exit__方法可以轻松地实现上下文管理协议,方便在with语句块中自动获取和释放资源。

2.7简化API设计:

魔术方法允许开发人员无需重新发明轮子就能利用Python语言本身的特性,如描述符协议中的__get____set____delete__方法可以用来定义属性访问行为,而无需显式编写复杂的属性访问逻辑。

Python的魔术方法极大地扩展了面向对象编程的能力,使得开发者能够根据需求定制类的行为,使之更符合预期,并且能更好地与其他Python内置对象协同工作。

3. 部分常用的魔术方法代码实例

3.1 初始化与销毁:
  • __init__(self, ...): 初始化一个新创建的对象。

    class Person:def __init__(self, name, age):self.name = nameself.age = agep = Person("Alice", 25)  # 创建Person实例时自动调用__init__
    
  • __del__(self): 对象被垃圾回收时调用,但不保证一定会执行。

    class FileWrapper:def __init__(self, file):self.file = open(file, 'r')def __del__(self):self.file.close()  # 当FileWrapper实例被删除时关闭文件with FileWrapper('example.txt') as f:  # 不推荐直接依赖__del__来管理资源pass
    
3.2 对象表示:
  • __str__(self): 返回一个用户友好的字符串表示形式,用于print等操作。

    class Point:def __init__(self, x, y):self.x = xself.y = ydef __str__(self):return f"Point({self.x}, {self.y})"p = Point(3, 4)
    print(p)  # 输出: Point(3, 4),这是因为调用了__str__
    
  • __repr__(self): 返回一个官方且可读性强的字符串表示形式,主要用于调试和交互式环境。

    class ComplexNumber:def __init__(self, real, imag):self.real = realself.imag = imagdef __repr__(self):return f"ComplexNumber({self.real}, {self.imag})"c = ComplexNumber(1, 2)
    print(repr(c))  # 输出: ComplexNumber(1, 2)
    
3.3 运算符重载:
  • __add__(self, other): 实现加法操作。
    class Vector2D:def __init__(self, x=0, y=0):self.x = xself.y = y# 定义向量相加的魔术方法def __add__(self, other):if isinstance(other, Vector2D):  # 确保other也是一个Vector2D对象return Vector2D(self.x + other.x, self.y + other.y)else:raise TypeError(" unsupported operand type(s) for +: 'Vector2D' and '{}'".format(type(other)))# 定义向量转为字符串的魔术方法def __str__(self):   #为了能够打印出result的值(即向量的坐标),我们需要添加一个__str__魔术方法来定义对象如何转换为字符串表示形式。return f"Vector2D(x={self.x}, y={self.y})"# 创建两个向量对象
    v1 = Vector2D(1, 2)
    v2 = Vector2D(3, 4)# 使用"+"操作符相加,实际上调用了__add__方法
    result = v1 + v2# 打印结果
    print(result)  # 输出:Vector2D(x=4, y=6)
    
3.4 容器协议:
  • __len__(self): 定义对象长度,配合len()函数使用。

    class MyList:def __init__(self, elements):self.elements = elementsdef __len__(self):return len(self.elements)lst = MyList([1, 2, 3])
    print(len(lst))  # 输出: 3
    
  • __getitem__(self, index): 提供索引访问功能。

    class Matrix:def __init__(self, data):self.data = datadef __getitem__(self, index):return self.data[index]m = Matrix([[1, 2], [3, 4]])
    print(m[0][1])  # 输出: 2
    

Python官方文档:https://docs.python.org/3/reference/datamodel.html#special-method-names

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

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

相关文章

第三十九周:文献阅读+Transformer

目录 摘要 Abstract 文献阅读:CNN与LSTM在水质预测中的应用 现有问题 提出方法 相关模型 CNN LSTM CNN-LSTM神经网络模型 模型框架 CNN-LSTM神经网络 研究实验 数据集 模型评估指标 数据预处理 实验设计与结果 研究贡献 Transformer Encoder-Dec…

uniapp返回上一页并刷新数据

在uniapp中&#xff0c;返回页面时onLoad是不会触发的 如果只需要在特定情况下返回上一页才需要刷新数据 可以使用$emit和$no去解决 例如&#xff1a;注册完成后返回到首页并隐藏注册按钮&#xff0c;register.vue和index.vue register.vue <template><view clic…

C#灵活的任务调度组件FluentScheduler

FluentScheduler是一个C#的灵活的任务调度组件&#xff0c;支持各类任务调度。网上有很多演示代码&#xff0c;此处记录下来&#xff0c;方便自己查找。 // See https://aka.ms/new-console-template for more information //Console.WriteLine("Hello, World!");us…

prometheus常用exporter

一、node-exporter node_exporter&#xff1a;用于监控Linux系统的指标采集器。 未在k8s集群内的linux机器监控 GitHub - prometheus/node_exporter: Exporter for machine metrics 常用指标&#xff1a; •CPU • 内存 • 硬盘 • 网络流量 • 文件描述符 • 系统负载 •…

Win系统搭建Elasticsearch实现公网远程访问本地服务

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎&#xff0c;它提供了一个分布式、多…

七、Qt 信号和槽

在QT4以上的版本&#xff0c;在窗体上用可以通过选中控件&#xff0c;然后点击鼠标右键单击按钮&#xff0c;选择“转到槽”。可以自动创建信号和槽。 选择clicked(),并点击 ok Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件&#xff08;信号和槽&#xff09;。 …

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《【Docker】centos中及自定义镜像&#xff0c;…

零零鸡生态养殖农场“出圈”,有“智”更有“质”,助力本土品牌高质量发展

什么是生态农场&#xff1f;不同于常规农场&#xff0c;它对农业生产经营单元的各个关键环节有着极为严格的要求&#xff0c;强调整体、协调、循环、再生、多样&#xff0c;产品质量自然更好&#xff0c;附加值也更高&#xff0c;更能满足日趋多样化的巨大市场。零零鸡生态农场…

如何在前端优化中处理大量的图像资源?

在前端优化中&#xff0c;处理大量的图像资源是一项重要的任务。由于图像占据了网站带宽的大部分&#xff0c;因此优化图像可以显著提高网站的性能和用户体验。下面将介绍一些在前端优化中处理大量图像资源的常见方法。 一、压缩图像 压缩图像是减少图像文件大小和优化图像的…

常见设计模式--通俗易懂版

一、设计模式原则 1.单一职责原则 核心&#xff1a;一个类只负责一个功能领域中相应的职责&#xff0c;或者可以定义为&#xff1a;就一个类而言&#xff0c;应该只有一个引起它变化的原因。 思想&#xff1a;如果一个类承担的职责过多&#xff0c;就等于把这些职责耦合在一起…

C#调用WinAPI部分命令

C#是针对WIndows而生的&#xff0c;开发WIndows应用最快。然而想要让自己程序进阶&#xff0c;就不需深入Windows底层&#xff0c;WinAPI为我们提供了一把利刃。 目录 1、查找窗口句柄 2、查找窗口内子对象 3、指定窗口样式 4、指定窗口扩展样式 5、调整窗口大小Z轴&…

C++在结构(Struct)中使用队列(Queue)

1.结构中实现队列功能: //队列数据 struct QueueData{int data;//数据QueueData *next;//下一个数据 };//队列结构 struct QueueStruct{QueueData *front;//队头,出队用QueueData *end;//队尾,入队用//构造队列QueueStruct(){front=end=NULL;}//空队bool Empty(){return fro…

python-模块-hashlib

1、hashlib模块介绍 Python hashlib 模块主要用于进行哈希&#xff08;hash&#xff09;操作。哈希&#xff08;Hash&#xff09;是一种将任意长度的输入数据映射为固定长度输出数据的算法。hashlib 模块提供了常见的哈希算法的实现&#xff0c;如 MD5、SHA-1、SHA-256 等。 …

还在因为版本不一致重装node吗,用它试试

一、卸载nodejs 首先卸载已安装的nodejs&#xff0c;总体分三步 1)打开控制面板&#xff0c;卸载nodejs 2)打开计算机->高级->环境变量&#xff0c;删除path中nodejs相关的配置 3)打开nodejs安装目录&#xff0c;整体删除 打开cmd&#xff0c;输入以下命令&#xff…

为什么要进行漏洞扫描工作

随着互联网的普及和信息技术的飞速发展&#xff0c;网络安全问题愈发引人关注。其中&#xff0c;漏洞扫描作为保障网络安全的重要手段&#xff0c;受到了广泛的关注和应用。本文将详细介绍漏洞扫描的概念、效果、使用场景等&#xff0c;以期为读者提供有关漏洞扫描的全面了解。…

网络分流规则

现在的网络是越来越复杂。 有必要进行分流。 有一些geosite.dat是已经整理好的&#xff0c;包含许多的网站的分类&#xff1a; 分流规则&#xff1a; route规则 主要是: {"type": "field","outboundTag": "direct","domain&quo…

【Vue3】2-11 : 生命周期钩子函数及原理分析

本书目录&#xff1a;点击进入 一、组件生命周期概述 1.1 官方生命周期 1.2 钩子函数&#xff08;回调函数&#xff09; ▶ 生命周期可划分为三个部分(- >表示执行循序)&#xff1a; 二、实战&#xff1a;测试生命周期流程 &#xff1e; 代码 &#xff1e; 效果 一…

ZZULIOJ 1111: 多个整数的逆序输出(函数专题)

题目描述 输入n和n个整数&#xff0c;以与输入顺序相反的顺序输出这n个整数。要求不使用数组&#xff0c;而使用递归函数实现。 递归函数实现过程如下&#xff1a; void inverse(int n) { 读入一个整数&#xff0c;存入num; if(n >1) { 将后面的n-1个数逆…

代码随想录算法训练营第二十一天|450.删除二叉搜索树中的节点

450.删除二叉搜索树中的节点 private void swapValue(TreeNode a, TreeNode b) {int t a.val;a.val b.val;b.val t; }public TreeNode deleteNode(TreeNode root, int key) {if (root null) {return null;}if (key < root.val) {root.left deleteNode(root.left, key)…

在CMake中自定义宏 add_definitions(-DDEBUG)

hehedalinux:~/Linux/loveDBTeacher-v6$ tree . ├── CMakeLists.txt └── test.c0 directories, 2 files hehedalinux:~/Linux/loveDBTeacher-v6$ test.c #include <stdio.h> #define NUMBER 3int main() {int a 10; #ifdef DEBUGprintf("我是一个程序猿,我…