Python 魔法方法小结

目录

引言

🌟 实例一:__init__构造方法

🌟 实例二:__str__和__repr__方法

🌟 实例三:__add__运算符重载

🌟 实例四:__len__方法

🌟 实例五:__getitem__和__setitem__索引操作

🌟 实例六:__iter__和__next__迭代器协议

🌟 实例七:__call__方法

🌟 实例八:__enter__和__exit__上下文管理器

🌟 实例九:__getattr__和__setattr__动态属性

🌟 实例十:__new__和单例模式



引言

在Python中,魔法方法是一些特别的成员函数,它们被用于实现Python的特殊语法。这些方法的名称由双下划线包围,例如__init__、__str__、__add__等。今天,我们将一起探索10个最常用的魔法方法,并通过实例代码来理解它们是如何工作的。

🌟 实例一:__init__构造方法

当我们创建一个类的实例时,__init__方法会被自动调用,用于初始化对象的状态。

class Person:def __init__(self, name, age):self.name = nameself.age = age
person = Person("张三", 30)
print(person.name)  # 输出:张三

🌟 实例二:__str__和__repr__方法

这两个方法用于返回对象的字符串表示,__str__通常更面向用户,而__repr__则用于调试。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name} ({self.age}岁)"def __repr__(self):return f"Person('{self.name}', {self.age})"
person = Person("李四", 25)
print(str(person))  # 输出:李四 (25岁)
print(repr(person)) # 输出:Person('李四', 25)
 

🌟 实例三:__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)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3.x, v3.y)  # 输出:4 6

🌟 实例四:__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))  # 输出:3

🌟 实例五:__getitem__和__setitem__索引操作

这两个方法允许我们自定义类的索引行为。​​​​​​​

class MyList:def __init__(self, items):self.items = itemsdef __getitem__(self, index):return self.items[index]def __setitem__(self, index, value):self.items[index] = value
my_list = MyList([1, 2, 3])
print(my_list[0])  # 输出:1
my_list[0] = 10
print(my_list[0])  # 输出:10
 

🌟 实例六:__iter__和__next__迭代器协议

定义一个对象如何被迭代。​​​​​​​

class Counter:def __init__(self, max):self.max = maxself.current = 0def __iter__(self):return selfdef __next__(self):if self.current >= self.max:raise StopIterationelse:self.current += 1return self.current - 1
for i in Counter(5):print(i)  # 输出:0, 1, 2, 3, 4

🌟 实例七:__call__方法

__call__使一个对象像函数一样被调用。​​​​​​​

class Callable:def __call__(self, x):return x * 2
func = Callable()
print(func(5))  # 输出:10
 

🌟 实例八:__enter__和__exit__上下文管理器

这些方法用于实现with语句中的上下文管理器。​​​​​​​

class MyFile:def __init__(self, filename):self.filename = filenamedef __enter__(self):self.file = open(self.filename, 'r')return self.filedef __exit__(self, exc_type, exc_val, exc_tb):self.file.close()
with MyFile('example.txt') as file:content = file.read()print(content)
 

🌟 实例九:__getattr__和__setattr__动态属性

当尝试访问不存在的属性时,__getattr__会被调用;__setattr__则在设置属性时被调用。​​​​​​​

class Dynamic:def __getattr__(self, name):return f"动态获取属性 {name}"def __setattr__(self, name, value):print(f"设置属性 {name} 为 {value}")super().__setattr__(name, value)
dynamic = Dynamic()
print(dynamic.some_attribute)  # 输出:动态获取属性 some_attribute
dynamic.some_attribute = "新的值"
 

🌟 实例十:__new__和单例模式

__new__在创建对象前被调用,可以用来实现单例模式。​​​​​​​

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出:True
 

这些魔法方法使Python的类和对象变得更加强大和灵活。掌握它们,你就掌握了Python的精髓之一。希望今天的分享能帮助你更好地理解并应用这些魔法方法!

如果你有任何问题或想了解更多细节,欢迎留言或私信!记得订阅我们的微信订阅号,以便及时收到更多有用的编程技巧和文章更新。🚀

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

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

相关文章

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展,视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域,由于其工作环境复杂、安全风险高,传统的监控方式已难以满足实际需求。因此,基于视频监控AI智能…

C#绘制阻抗圆图初步

阻抗圆图,或者叫史密斯图,是无线电设计方面用的; 基本的阻抗圆图如下, 下面尝试用C#能不能画一下; 先在网上找一个画坐标的C#类,它的效果如下; 自己再增加一个函数,可以绘制中心在…

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

Android-- 集成谷歌地图

引言 项目需求需要在谷歌地图: 地图展示,设备点聚合,设备站点,绘制点和区域等功能。 我只针对我涉及到的技术做一下总结,希望能帮到开始接触谷歌地图的伙伴们。 集成步骤 1、在项目的modle的build.gradle中添加依赖如…

WSL-Ubuntu20.04部署环境配置

1.更换Ubuntu软件仓库镜像源 为了在WSL上使用TensorRT进行推理加速,需要安装以下环境,下面将按以下顺序分别介绍安装、验证以及删除环境: #1.C环境配置 gcc、gdb、g #2.gpu环境 cuda、cudnn #3.Cmake环境 CMake #4.OpenCV环境 OpenCV #5.Ten…

在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 > 原文在点这里 为了自己实现批量插入&#xff0c;我在mapper层使用insert注解写了一段自定义sql //自定义的批量插入方法 Insert("<script>" "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no…

Web3时代的教育技术革新:智能合约在学习管理中的应用

随着区块链技术的发展和普及&#xff0c;Web3时代正在为教育技术带来前所未有的革新和机遇。智能合约作为区块链技术的核心应用之一&#xff0c;不仅在金融和供应链管理等领域展示了其巨大的潜力&#xff0c;也在教育领域中逐渐探索和应用。本文将探讨智能合约在学习管理中的具…

分词任务介绍-(十)

分词任务 中文分词正向最大匹配实现方式一实现方式二 反向最大匹配双向最大匹配jieba分词上述分词方法的缺点总结基于机器学习 总结分词技术经验总结 中文分词 正向最大匹配 分词的步骤 1.收集整理一个词表&#xff0c;类似于字典。如下图 2.对于待分词的句子&#xff0c;或者…

总结单例模式的写法

一、单例模式的概念 1.1 单例模式的概念 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。就是当前进程确保一个类全局只有一个实例。 1.2 单例模式的优…

2024 China Joy 前瞻 | 腾讯网易发新作,网易数智携游戏前沿科技、创新产品以及独家礼盒,精彩不断!

今年上半年&#xff0c;CES、MWC和AWE三大国际科技展轮番轰炸&#xff0c;吸引全球科技爱好者的高度关注&#xff0c;无论是新潮的科技产品&#xff0c;还是对人工智能的探索&#xff0c;每一项展出的技术和产品都引起了市场的热议。而到了下半年&#xff0c;一年一度的China J…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

Android View的绘制流程

1.不管是View的添加&#xff0c;还是调用View的刷新方法invalidate()或者requestLayout()&#xff0c;绘制都是从ViewRootImpl的scheduleTraversals()方法开始 void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled true;mTraversalBarrier mHandler…

SpringCloud教程 | 第九篇: 使用API Gateway

1、参考资料 SpringCloud基础篇-10-服务网关-Gateway_springcloud gateway-CSDN博客 2、先学习路由&#xff0c;参考了5.1 2.1、建了一个cloudGatewayDemo&#xff0c;这是用来配置网关的工程&#xff0c;配置如下&#xff1a; http://localhost:18080/aaa/name 该接口代码如…

科普文:详解23种设计模式

概叙 设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结&#xff0c;其中最出名的当属 Gang of Four&#xff08;GoF&#xff09;的分类了&#xff0c;他们将设计模式分类为 23 种经典的模式&#xff0c;根据用途我们又可以分为三大类&#xff0c;分别为创建型模式…

等保-Linux等保测评

等保-Linux等保测评 1.查看相应文件&#xff0c;账户xiaoming的密码设定多久过期 rootdengbap:~# chage -l xiaoming Last password change : password must be changed Password expires : pass…

理解类与对象:面向对象基础

目录 1. 类的定义1.1 格式1.2 访问限定符1.3 类域 2.实例化2.1 实例化概念2.2 对象大小 3.this指针 1. 类的定义 1.1 格式 class为定义类的关键字&#xff0c;Date为类的名字&#xff0c;{ }中为类的主体&#xff0c;注意类定义结束后面的分号不能省略。类体中内容称为类的成…

【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks

阅读时间&#xff1a;2023-12-26 1 介绍 年份&#xff1a;2019 作者&#xff1a;Johannes von Oswald&#xff0c;Google Research&#xff1b;Christian Henning&#xff0c;EthonAI AG&#xff1b;Benjamin F. Grewe&#xff0c;苏黎世联邦理工学院神经信息学研究所 期刊&a…

如何在项目中打印sql和执行的时间

目标&#xff1a;打印DAO方法中sql和执行的时间 一种方式是去实现Mybatis的拦截器Interceptor &#xff0c;比较麻烦&#xff1b; 这里介绍一种比较简单的实现方式&#xff1b; 1、如何打印sql&#xff1f; 配置文件加这个可以打印出com.zhenhui.ids.busi.watch包下执行的sq…

3D线上展厅:元宇宙时代的营销利器,流量暴增的秘密武器!

在体验经济蓬勃发展的当下&#xff0c;企业营销领域正以前所未有的热情探索创新路径&#xff0c;元宇宙这一融合了无限想象与未来科技的概念&#xff0c;成为了众多品牌竞相追逐的新蓝海。3D技术、增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&#xff09;以及…

【ProtoBuf】proto 3 语法 -- 详解

这个部分会对通讯录进行多次升级&#xff0c;使用 2.x 表示升级的版本&#xff0c;最终将会升级如下内容&#xff1a; 不再打印联系人的序列化结果&#xff0c;而是将通讯录序列化后并写入文件中。 从文件中将通讯录解析出来&#xff0c;并进行打印。 新增联系人属性&#xff…