【进阶Python】第四讲:类的特殊方法(下篇)

简介: 在Python中,通过类的特殊方法可以给类添加上运算法、字符串、函数调用、迭代器等众多功能,让Python面向对象编程变的更加丰富。前文介绍了一些比较常用的特殊方法,Python中的特殊方法远不止这些,本文介绍剩余的一些特殊方法。当然,由于篇幅有限,不可能面面俱到的把每一个方法都详细的介绍,因此,本文会按功能对剩余的特殊方法进行分类,从每类中挑选个别的进行编码讲解。

前言

特殊方法是为我们定义的类添加上某些特殊功能的方法,上一讲分组讲解了Python的几对特殊方法(或者成为魔术方法),分别是,

  • __new__与__init__
  • __enter__与__exit__
  • __str__与__repr__
  • __setattr__、__getattr__
  • __getattribute__、__delattr__

这些都是相对较为常用的。Python中类的特殊方法远不止这些,其中还有一些不太常用,或者在某些特定场景下用到的特殊方法。

本讲会按照功能对剩余的特殊方法进行分类,不再详细的把每个特殊方法的使用都展开阐述,会着重的从每种功能中挑选出具有代表性的特殊方法进行实现、详细讲解。

函数调用

假如我们定义一个用于算数运算的类,

class Operation(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def add(self):
        print("The result is {}".format(self.x + self.y))
opt = Operation(2, 2)
opt.add()
# 输出
The result is 4

从这段代码可以看出 ,这是我们一贯使用类及类方法的方式,实例化--调用,其实Python提供有特殊方法__call__能够让类的调用像调用函数的方式一样。

这句话听着似乎很绕口,具体什么含义呢?用一段代码来说明,

class Operation(object):
    def __init__(self):
        self.x = None
        self.y = None
    def add(self):
        print("The result is {}".format(self.x + self.y))
    def __call__(self, x, y):
        self.x = x
        self.y = y
        self.add()
opt = Operation()
opt(3, 3)
# 输出
The result is 6

当我们给类添加特殊方法__call__后,我们可以直接使用实例名(opt)来调用类的方法,就不用在用instance.method的方法去调用。换句话说就是,当我们定义__call__后,我们使用实例名进行调用时,它会首先进入__call__方法,执行__call__中的程序。

容器与序列

容器和序列分别涉及2个特殊方法:__contains____len__

从__len__名称就可以看出它的功能,给类添加一个获取序列长度的功能,所以这里着重讲解一下容器,顺带讲解一下__len__。

我们在条件语句中经常会用到这样的语句if … inif … not in,其中__contains__就可以给类添加这样一个功能,可以通过if … inif … not in来调用类的实例,以一段代码来举例,

class Contain(object):
    def __init__(self, data):
        self.data = data
    def __contains__(self, x):
        return x in self.data
    def __len__(self):
        return len(self.data)
contain = Contain([2,3,4,5])
if 2 in contain:
    print("222222")
if 6 not in contain:
    print("666666")
len(contain)
# 输出
222222
666666
4

从代码中可以看出,当我们调用if 2 in contain时会调用__contains__这个特殊方法,通过方法中的语句返回一个布尔型的值。此外,可以看到代码中有这样一句调用len(contain),它就是前面提到的特殊方法__len__的功能,它可以给类添加一个获取序列长度的功能,当使用len(instance)时会调用__len__方法中的程序。

算数运算

用于实现算数运算的有以下类的特殊方法的有以下几个,

运算 代码 特殊方法
加法 a + b __add__
减法 a - b __sub__
乘法 a * b __mul__
除法 a / b __truediv__
向下取整除法 a // b __floordiv__
取余 a % b __mod__

以一段代码举例说明加法与乘法的使用,

class Operation(object):
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return Operation(self.value + other.value)
    def __mul__(self, other):
        return Operation(self.value * other.value)
    def __str__(self):
        return "the value if {}".format(self.value)
a = Operation(3)
b = Operation(5)
print(a + b)
print(a * b)
# 输出
the value if 8
the value if 15

同理,其他几种算法运算的使用方法同加法、乘法相同。

比较运算

类的特殊方法不仅提供了算术运算,还提供了比较运算的特殊方法,它们分别是,

运算 代码 特殊方法
等于 a == b __eq__
不等 a != b __ne__
大于 a > b __gt__
小于 a < b __lt__
大于等于 a >= b __ge__
小于等于 a <= b __le__

以一段代码解释比较运算符的使用,

class Cmp(object):
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return self.value == other.value
    def __gt__(self, other):
        return self.value > other.value
a = Cmp(3)
b = Cmp(3)
a == b
# 输出
True

可以看出,比较运算和算术运算的使用非常相似。

字典功能

我们可以通过如下几个特殊方法为类添加如同字典一样的功能,

运算 代码 特殊方法
取值 x[key] __setitem__
设置值 x[key]=value __getitem__
删除值 del x[key] __delitem__

下面以一段代码举例说明,

class Dictionaries(object):
    def __setitem__(self, key, value):
        self.__dict__[key] = value
    def __getitem__(self, key):
        return self.__dict__[key]
    def __delitem__(self, key):
        del self.__dict__[key]
diction = Dictionaries()
diction["one"] = 1
diction["two"] = 2
diction["three"] = 3
diction['three']
del diction['three']
diction['three']
# 输出
3
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-57-dfe1a566046b> in <module>()
----> 1 diction['three']
<ipython-input-55-21dcfd1e91cb> in __getitem__(self, key)
      4 
      5     def __getitem__(self, key):
----> 6         return self.__dict__[key]
      7 
      8     def __delitem__(self, key):
KeyError: 'three'

可以看出,当删除键值为three的值之后再次去获取会报错。

其他

除了上述提到的特殊方法之后,Python还有很多特殊方法,这里不一一举例说明,下面列举出这些特殊方法以及它们的功能和使用方法,如果感兴趣的可以对应的去查找文档学习。

运算 代码 特殊方法
类析构函数 del instant __del__
格式化字符串 format(x, format_spec) __format__
遍历迭代器 iter(list) __iter__
取迭代器下一个值 next(list) __next__
列出类的所有属性和方法 dir(instance) __dir__
自定义散列值 hash(instance) __hash__
自定义拷贝 copy.copy(instance) __copy__
自定义深层拷贝 copy.deepcopy(instance) __deepcopy__
上下文环境布尔值 if instance: __bool__

当然,除了这些,Python还有其他的特殊方法,例如逻辑运算、按位运算等,感兴趣的可以参考官方文档仔细学习一下,本文仅列举一些相对常用的一些特殊方法。

目录
打赏
0
0
0
0
7
分享
相关文章
|
4月前
|
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
685 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
2月前
|
Python技术解析:了解数字类型及数据类型转换的方法。
在Python的世界里,数字并不只是简单的数学符号,他们更多的是一种生动有趣的语言,用来表达我们的思维和创意。希望你从这个小小的讲解中学到了有趣的内容,用Python的魔法揭示数字的奥秘。
82 26
|
2月前
|
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
200 37
解决Python requests库POST请求参数顺序问题的方法。
总之,想要在Python的requests库里保持POST参数顺序,你要像捋顺头发一样捋顺它们,在向服务器炫耀你那有条不紊的数据前。抓紧手中的 `OrderedDict`与 `json`这两把钥匙,就能向服务端展示你的请求参数就像经过高端配置的快递包裹,里面的商品摆放井井有条,任何时候开箱都是一种享受。
55 10
|
2月前
|
Python 中__new__方法详解及使用
__new__ 是 Python 中用于创建类实例的静态方法,在实例化对象时优先于 __init__ 执行。它定义在基础类 object 中,需传递 cls 参数(表示当前类)。__new__ 可决定是否使用 __init__ 方法或返回其他对象作为实例。特性包括:1) 在实例化前调用;2) 始终为静态方法。示例中展示了其用法及 Python2 和 Python3 的差异,强调了参数处理的不同。
106 10
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
103 9
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
309 8
|
3月前
|
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
87 17

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问