Python Task 11:魔法方法

本文深入解析Python中的魔法方法,包括构造方法、算术运算、属性访问等,详细介绍了如何通过魔法方法实现类的定制,增强Python编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python Task 11:魔法方法

  • 魔方方法或者又称为特殊方法,是指被包含下划线的方法或者所能调用到的方法的统称,这些通常会在特殊的情况下调用,并且基本没有手动调用他们的必要。

1.构造方法

  • 构造方法就是类似于init的初始化方法,差别在于一个对象被构建好以后会自动调用构造方法。
    在这里插入图片描述
    2.算术运算
算术运算符描述
add(self, other)定义加法的行为:+
sub(self, other)定义减法的行为:-
mul(self, other)定义乘法的行为:*
truediv(self, other)定义真除法的行为:/
floordiv(self, other)定义整数除法的行为://
mod(self, other)定义取模算法的行为:%
divmod(self, other)定义当被 divmod() 调用时的行为
pow(self, other[, modulo])定义当被 power() 调用或 ** 运算时的行为
lshift(self, other)定义按位左移位的行为:<<
rshift(self, other)定义按位右移位的行为:>>
and(self, other)定义按位与操作的行为:&
xor(self, other)定义按位异或操作的行为:^
or(self, other)定义按位或操作的行为:l

在这里插入图片描述

反运算描述
radd(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rsub(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rmul(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rtruediv(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rfloordiv(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rmod(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rdivmod(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rpow(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rlshift(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rrshift(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
rxor(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用
ror(self, other)当被运算对象(左边的操作对象)不支持该运算时被调用

在这里插入图片描述
3.简单定制
在这里插入图片描述
4.属性访问

语句描述
getattr(self, name)定义当用户试图获取一个不存在的属性时的行为。
getattribute(self, name)定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用__getattr__)
setattr(self, name, value)定义当一个属性被设置时的行为。
delattr(self, name)定义当一个属性被删除时的行为。

在这里插入图片描述
5.描述符

  • 描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
语句描述
get(self, instance, owner)用于访问属性,它返回属性的值。
set(self, instance, value)将在属性分配操作中调用,不返回任何内容。
del(self, instance)控制删除操作,不返回任何内容。

在这里插入图片描述
6.定制序列

  • 如果说你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem()__方法。
  • 如果你希望定制的容器是可变的话,除了__len__()和__getitem__()方法,你还需要定义__setitem__()和__delitem()__两个方法。
    在这里插入图片描述
  • len(self)定义当被len()调用时的行为(返回容器中元素的个数)。
  • getitem(self, key)定义获取容器中元素的行为,相当于self[key]。
  • setitem(self, key, value)定义设置容器中指定元素的行为,相当于self[key] = value。
  • delitem(self, key)定义删除容器中指定元素的行为,相当于del self[key]。

7.迭代器

  • 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。

  • 迭代器是一个可以记住遍历的位置的对象。

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

  • 迭代器只能往前不会后退。

  • 字符串,列表或元组对象都可用于创建迭代器
    在这里插入图片描述

  • 迭代器有两个基本的方法:iter() 和 next()。

语句描述
iter(object) 函数用来生成迭代器
next(iterator[, default])返回迭代器的下一个项目
iterator可迭代对象
default可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常

在这里插入图片描述
把一个类作为一个迭代器使用需要在类中实现两个魔法方法 iter() 与 next() 。

  • iter(self)定义当迭代容器中的元素的行为,返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next()__方法并通过 StopIteration 异常标识迭代的完成。
  • next() 返回下一个迭代器对象。
  • StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next()__方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

8.生成器

  • 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
  • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行
    next() 方法时从当前位置继续运行。
  • 调用一个生成器函数,返回的是一个迭代器对象。
    在这里插入图片描述
    9.推导式
  • 列表推导式
    在这里插入图片描述
  • 字典推导式
    在这里插入图片描述
  • 集合推导式
    在这里插入图片描述
    10.增量赋值运算符
语句描述
iadd(self, other)定义赋值加法的行为:+=
isub(self, other)定义赋值减法的行为:-=
imul(self, other)定义赋值乘法的行为:*=
itruediv(self, other)定义赋值真除法的行为:/=
ifloordiv(self, other)定义赋值整数除法的行为://=
imod(self, other)定义赋值取模算法的行为:%=
ipow(self, other[, modulo])定义赋值幂运算的行为:**=
ilshift(self, other)定义赋值按位左移位的行为:<<=
irshift(self, other)定义赋值按位右移位的行为:>>=
iand(self, other)定义赋值按位与操作的行为:&=
ixor(self, other)定义赋值按位异或操作的行为:^=
ior(self, other)定义赋值按位或操作的行为:

11.一元操作符

语句描述
neg(self)定义正号的行为:+x
pos(self)定义负号的行为:-x
abs(self)定义当被 abs() 调用时的行为
invert(self)定义按位求反的行为:~x

12.类型转换

语句描述
complex(self)定义当被 complex() 调用时的行为(需要返回恰当的值)
int(self)定义当被 int() 调用时的行为(需要返回恰当的值)
float(self)定义当被 float() 调用时的行为(需要返回恰当的值)
round(self[, n])定义当被 round() 调用时的行为(需要返回恰当的值)
index(self)1. 当对象是被应用在切片表达式中时,实现整形强制转换 2.如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 index 3.如果 index 被定义,则 int 也需要被定义,且返回相同的值

参考来源:
https://blog.youkuaiyun.com/qq_38520096/article/details/79237593
https://mp.weixin.qq.com/s/y5cTjzMHqS4xMEUrUEiV_g
https://www.jianshu.com/p/d5d79762ce7e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值