python的魔术方法

python的魔术方法

在 Python 中,魔术方法(Magic Methods),也称为双下划线方法(Dunder Methods),是一些以双下划线开头和结尾的方法。这些方法让用户可以定义对象的行为,并在特定的情况下被自动调用。常见的魔术方法包括:

1)__init__:构造函数,在创建对象时调用。

2)__del__ :析构函数,在对象被删除时调用。

3)__str__:定义对象的字符串表示,用于 print()str()

4)__repr__:定义对象的官方字符串表示,用于 repr()函数。

5)__eq__ :定义对象相等性比较,处理 == 运算符。

6)__lt__ :定义对象小于比较,处理 < 运算符。

7)__add__:定义对象的加法操作,处理 +运算符。

8) __call__:使对象可以像函数一样被调用。

9)__getitem__:定义获取元素的方法,允许使用索引访问。

10)__setitem__:定义设置元素的方法,允许使用索引赋值。

扩展

Python 的魔术方法不仅限于上述列出的,还包括很多用于不同操作的特殊方法,这些方法有助于简化一些复杂的操作并提高代码的可读性和维护性。

1)运算符重载:通过定义 __add____sub____mu1__ 等方法,自定义对象的加法、减法、乘法等运算。运算符重载使定制类像内置类一样使用。

# 定义一个二维向量类
class Vector:
    def __init__(self, x, y):
        # 初始化方法,接收两个参数 x 和 y
        # 分别表示向量的横坐标和纵坐标
        self.x = x
        self.y = y

    def __add__(self, other):
        # 重载加法运算符 +
        # 将当前向量 (self.x, self.y) 与另一个向量 (other.x, other.y) 相加
        # 返回一个新的 Vector 对象,表示两个向量的和
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        # 定义 __repr__ 方法,用于返回向量的字符串表示
        # 格式为 "Vector(x, y)"
        return f"Vector({self.x}, {self.y})"

# 创建两个向量对象
v1 = Vector(2, 3)  # 向量 v1,坐标为 (2, 3)
v2 = Vector(5, 7)  # 向量 v2,坐标为 (5, 7)

# 使用重载的加法运算符 + 对两个向量相加
result = v1 + v2  # 结果为一个新的向量,坐标为 (7, 10)

# 打印相加结果,调用 __repr__ 方法返回的字符串表示
print(result)  # 输出: Vector(7, 10)

2)上下文管理:通过定义__enter__ __exit__ 方法,使对象能够使用 with 语句。这在资源管理(如文件操作、数据库连接)中尤为常见。

# 定义一个自定义资源管理类
class CustomResource:
    def __enter__(self):
        # __enter__ 方法在进入上下文时自动调用
        # 此处可以放置资源初始化或获取逻辑
        print("Resource acquired")  # 模拟资源获取
        return self  # 返回资源对象,供 with 块内的变量使用

    def __exit__(self, exc_type, exc_val, exc_tb):
        # __exit__ 方法在退出上下文时自动调用
        # 用于清理资源,无论是否发生异常都会执行
        # 参数 exc_type, exc_val, exc_tb 分别表示异常的类型、值和追踪信息(如果发生异常)
        print("Resource released")  # 模拟资源释放

# 使用 with 语句管理 CustomResource 实例的上下文
# 在上下文开始时自动调用 __enter__,结束时自动调用 __exit__
with CustomResource() as resource:
    print("Using resource")  # 模拟在上下文中使用资源

# 输出结果:
# Resource acquired  -> 表示资源已获取
# Using resource     -> 表示正在使用资源
# Resource released  -> 表示资源已释放

3)容器对象:通过定义__1en__ __getitem____setitem____delitem__ __contains__等方法,可以自定义类的行为,使其像列表、字典等容器对象一样使用

# 定义一个自定义列表类,模仿内置列表的部分行为
class CustomList:
    def __init__(self):
        # 初始化方法,创建一个空的列表 items 用于存储元素
        self.items = []

    def __len__(self):
        # 重载 len() 函数,返回列表的长度
        return len(self.items)

    def __getitem__(self, idx):
        # 重载索引访问运算符 [],实现通过索引获取列表元素
        return self.items[idx]

    def __setitem__(self, idx, value):
        # 重载索引赋值运算符 [],实现通过索引设置列表元素
        self.items[idx] = value

    def __delitem__(self, idx):
        # 重载索引删除运算符 del[],实现通过索引删除列表元素
        del self.items[idx]

# 创建一个 CustomList 实例
cl = CustomList()

# 向自定义列表中添加元素
cl.items.append(1)  # 添加元素 1 到列表中
cl.items.append(2)  # 添加元素 2 到列表中

# 使用 len() 函数获取列表的长度
print(len(cl))    # 输出 2,因为列表中有两个元素

# 使用索引访问第一个元素
print(cl[0])      # 输出 1,对应索引 0 的元素

# 使用索引设置第二个元素的值
cl[1] = 3         # 将索引 1 的元素修改为 3

# 打印自定义列表的内容
print(cl.items)   # 输出 [1, 3],因为第一个元素是 1,第二个元素被修改为 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Long韵韵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值