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

Python 魔术方法

在Python中,魔术方法(Magic Methods)或称为双下划线方法(Dunder Methods),是一类具有特殊用途的方法,其名称前后都带有两个下划线(如 __init____str__ 等)。这些方法定义了对象的内置行为,使得类的实例能够表现得像内置类型一样。以下是Python中一些常用的魔术方法及其使用示例:

1. __init__(self, ...)

用于对象的初始化。在创建对象时调用。

 

python复制代码

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
print(p.name, p.age) # 输出: Alice 30

2. __str__(self)

定义对象的字符串表示。当使用 print() 或 str() 函数时调用。

 

python复制代码

class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
p = Person("Alice", 30)
print(p) # 输出: Person(name=Alice, age=30)

3. __repr__(self)

定义对象的“官方”字符串表示,通常用于调试。repr() 函数会调用这个方法。

 

python复制代码

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

4. __add__(self, other)

定义加法运算符(+)的行为。

 

python复制代码

class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __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

5. __getitem__(self, key)

定义获取元素的行为,用于索引操作(如 obj[key])。

 

python复制代码

class MyList:
def __init__(self, elements):
self.elements = elements
def __getitem__(self, key):
return self.elements[key]
ml = MyList([1, 2, 3, 4, 5])
print(ml[1]) # 输出: 2

6. __setitem__(self, key, value)

定义设置元素的行为,用于索引赋值操作(如 obj[key] = value)。

 

python复制代码

class MyList:
def __init__(self, elements):
self.elements = elements
def __getitem__(self, key):
return self.elements[key]
def __setitem__(self, key, value):
self.elements[key] = value
ml = MyList([1, 2, 3, 4, 5])
ml[1] = 10
print(ml[1]) # 输出: 10

7. __len__(self)

定义获取对象长度(如列表长度)的行为,用于 len() 函数。

 

python复制代码

class MyList:
def __init__(self, elements):
self.elements = elements
def __len__(self):
return len(self.elements)
ml = MyList([1, 2, 3, 4, 5])
print(len(ml)) # 输出: 5

8. __call__(self, *args, **kwargs)

定义对象像函数一样被调用的行为(如 obj())。

 

python复制代码

class Adder:
def __init__(self, n):
self.n = n
def __call__(self, x):
return x + self.n
add_five = Adder(5)
print(add_five(3)) # 输出: 8

9. __enter__(self) 和 __exit__(self, exc_type, exc_val, exc_tb)

用于定义对象的上下文管理行为,通常与 with 语句一起使用。

 

python复制代码

class MyContext:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Exiting the context")
return False # 如果返回 True,则异常会被忽略
with MyContext() as ctx:
print("Inside the context")
# 输出:
# Entering the context
# Inside the context
# Exiting the context

这些魔术方法是Python面向对象编程中非常强大的一部分,通过它们可以使自定义的类表现得更加自然和符合直觉。

http://www.lryc.cn/news/464027.html

相关文章:

  • 03 go语言(golang) - fmt包基本类型
  • Docker本地镜像发布到阿里云镜像服务的简易指南
  • 大数据学习---快速了解clickhouse数据库
  • 哪些方法可以缓解面试紧张?
  • 即时通讯未读消息计数
  • 在Openshift(K8S)上通过EMQX Operator部署Emqx集群
  • Python酷玩之旅_数据分析入门(matplotlib)
  • uiautomatorviewer安卓9以上正常使用及问题处理
  • Go语言gRPC快速入门
  • Golang | Leetcode Golang题解之第479题最大回文数乘积
  • UDP协议讲解
  • 交叉注意力融合时域、频域特征的FFT + CNN -BiLSTM-CrossAttention轴承故障识别模型
  • CSDN Markdown 编辑器语法大全
  • TCP/IP 协议【四次挥手】简要说明
  • 第11篇:网络安全协议
  • ES-入门-javaApi-文档-新增-删除
  • 【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b
  • 【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例
  • C#中委托的应用与示例
  • 算法: 模拟题目练习
  • 软考中级科目怎么选?软考中级证书有什么用?
  • HTTP 请求的请求体是什么
  • 助力语音技术发展,景联文科技提供语音数据采集服务
  • PyTorch搭建神经网络入门教程
  • 你的电脑能不能安装windows 11,用这个软件检测下就知道了
  • BF 算法
  • SHOW-O——一款结合多模态理解和生成的单一Transformer
  • 缓存框架JetCache源码解析-缓存变更通知机制
  • Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色
  • 用自己的数据集复现YOLOv5