Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
概述
在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__(),然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是在使用内置函数iter(x)来迭代对象x。
在Java中,并没有像Python那样简单的实现方式。如果要进行比较,你需要实现compare方法;如果想要生成特定的对象,必须编写适当的构造器方法;如果想要打印对象,就需要实现toString方法等等。此外,在Java中的魔术类或方法以及各种本地方法基本上是不允许我们修改的。因此,我们还是简单地看一下Python是如何调用的吧。
常用特殊方法及实现
下面将介绍一些常用特殊方法和实现。
__init__(self, ...)
构造函数主要用于初始化对象的属性。通过在类中定义__init__方法,可以在创建对象时自动调用该方法来初始化对象的属性。在构造函数中,可以通过self参数来访问对象的属性和方法,并为其赋予初始值。构造函数在对象创建时只会被调用一次,可以在其中执行一些必要的初始化操作,以确保对象在创建后处于正确的状态。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('xiaoyu', 18)
print(person.name) # 输出: xiaoyu
print(person.age) # 输出: 18
__str__(self)
返回对象的字符串表示,可通过print(obj)来调用。这个方法对于调试和输出对象信息非常有用,可以提供更友好和可读性更高的输出结果。通过实现__str__方法,我们可以轻松地控制对象的打印行为,使其更符合我们的需求和预期。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person: {self.name}, {self.age} years old"
person = Person('xiaoyu', 18)
print(person) # 输出: Person: xiaoyu, 18 years old
__repr__(self)
返回对象的可打印字符串表示,可通过obj来调用。与__str__方法类似,__repr__方法也用于提供对象的字符串表示,但它的目标是更加精确和完整地描述对象的内部状态和结构。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
person = Person('xiaoyu', 18)
print(person) # 输出: Person(name=xiaoyu, age=18)
__len__(self)
返回对象的长度,可通过len(obj)来调用。在Python中,len()函数通常用于获取容器对象的元素个数,比如列表、字符串、字典等。通过实现__len__方法,我们可以自定义对象的长度,并使其适应于特定的应用场景。例如,如果我们定义了一个自定义的容器类,可以通过实现__len__方法来返回容器中元素的个数。这样,我们就可以像对待其他内置容器一样,使用len()函数来获取自定义容器对象的长度。
class MyList:
def __init__(self):
self.data = []
def __len__(self):
return len(self.data)
my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
print(len(my_list)) # 输出: 5
__getitem__(self, key)
获取对象的指定元素,可通过obj[key]来调用。并将键值key传递给它作为参数。
class MyList:
def __init__(self):
self.data = []
def __getitem__(self, key):
return self.data[key]
my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
print(my_list[2]) # 输出: 3
__setitem__(self, key, value)
设置对象的指定元素,通过重载该方法,可以实现通过obj[key] = value来调用该方法。
class MyList:
def __init__(self):
self.data = []
def __setitem__(self, key, value):
self.data[key] = value
my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
my_list[2] = 10
print(my_list.data) # 输出: [1, 2, 10, 4, 5]
__delitem__(self, key)
删除对象的指定元素,可通过del obj[key]来调用。当你想要从对象中删除特定的元素时,这个方法会非常有用。
class MyList:
def __init__(self):
self.data = []
def __delitem__(self, key):
del self.data[key]
my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
del my_list[2]
print(my_list.data) # 输出: [1, 2, 4, 5]
__iter__(self)
返回一个可迭代对象,以便我们可以通过for item in obj的方式进行迭代。
class MyList:
def __init__(self):
self.data = []
def __iter__(self):
return iter(self.data)
my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
for item in my_list:
print(item) # 输出: 1 2 3 4 5
__next__(self)
返回迭代器的下一个元素,可通过next(obj)来调用。
class MyIterator:
def __init__(self):
self.data = [1, 2, 3, 4, 5]
self.index = 0
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
item = self.data[self.index]
self.index += 1
return item
my_iterator = MyIterator()
print(next(my_iterator)) # 输出: 1
print(next(my_iterator)) # 输出: 2
print(next(my_iterator)) # 输出: 3
__call__(self, ...)
将对象作为函数调用时触发,可通过obj(...)来调用。
class MyFunc:
def __call__(self, x, y):
return x + y
my_func = MyFunc()
result = my_func(3, 4)
print(result) # 输出: 7
__eq__(self, other)
判断对象是否相等,可通过obj == other来调用。在Java中如果判断对象引用的话,你也需要重写equals这个方法。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
point1 = Point(1, 2)
point2 = Point(1, 2)
print(point1 == point2) # 输出: True
__lt__(self, other)
判断对象是否小于另一个对象,可通过obj < other来调用。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __lt__(self, other):
return self.x < other.x and self.y < other.y
point1 = Point(1, 2)
point2 = Point(3, 4)
print(point1 < point2) # 输出: True
__gt__(self, other)
判断对象是否大于另一个对象,可通过obj > other来调用。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __gt__(self, other):
return self.x > other.x and self.y > other.y
point1 = Point(3, 4)
point2 = Point(1, 2)
print(point1 > point2) # 输出: True
__add__(self, other)
定义对象的加法操作,可通过obj + other来调用。这样的话,你也可以对对象进行进行运算操作了
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)
vector1 = Vector(1, 2)
vector2 = Vector(3, 4)
result = vector1 + vector2
print(result.x, result.y) # 输出: 4 6
__sub__(self, other)
定义对象的减法操作,可通过obj - other来调用。
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
vector1 = Vector(3, 4)
vector2 = Vector(1, 2)
result = vector1 - vector2
print(result.x, result.y) # 输出: 2 2
常用特殊(魔术)方法的汇总一览表
以下是20个常用的特殊方法及其调用方式的表格,再多的用到了我们在看一下就可以了,只要记住(__)这个下划线开头和结尾的方法就可。请看下表:
| 特殊方法 | 描述 | 调用方式 |
|---|---|---|
__init__ |
初始化对象 | obj = ClassName() |
__str__ |
返回对象的字符串表示 | str(obj) |
__len__ |
返回对象的长度 | len(obj) |
__getitem__ |
获取对象的元素 | obj[index] |
__setitem__ |
设置对象的元素 | obj[index] = value |
__delitem__ |
删除对象的元素 | del obj[index] |
__contains__ |
判断对象是否包含某个元素 | value in obj |
__add__ |
实现对象的加法 | obj1 + obj2 |
__sub__ |
实现对象的减法 | obj1 - obj2 |
__mul__ |
实现对象的乘法 | obj1 * obj2 |
__div__ |
实现对象的除法 | obj1 / obj2 |
__eq__ |
判断对象是否相等 | obj1 == obj2 |
__ne__ |
判断对象是否不相等 | obj1 != obj2 |
__lt__ |
判断对象是否小于 | obj1 < obj2 |
__gt__ |
判断对象是否大于 | obj1 > obj2 |
__le__ |
判断对象是否小于等于 | obj1 <= obj2 |
__ge__ |
判断对象是否大于等于 | obj1 >= obj2 |
__iter__ |
返回一个迭代器对象 | iter(obj) |
__next__ |
返回迭代器的下一个元素 | next(obj) |
__del__ |
对象销毁时调用 | del obj |
__call__ |
将对象作为函数调用 | obj() |
总结
Python中的特殊方法(魔术方法)是由Python解释器自动调用的,用于实现对象的特定功能。常用的特殊方法包括__init__、__str__、__repr__、__len__、__getitem__、__setitem__、__delitem__、__iter__、__next__、__call__等。通过实现这些特殊方法,我们可以自定义对象的行为,使其更加符合我们的需求和预期。这些特殊方法的调用方式也有所不同,可以通过内置函数、运算符、迭代等方式来调用。掌握了这些特殊方法的用法,可以提高我们在Python中编写类和对象的灵活性和可扩展性。
Java开发者的Python快速进修指南:探索15种独特的Python特殊方法的更多相关文章
- 针对Quant的Python快速入门指南
作者:用Python的交易员 (原创文章,转载请注明出处) 最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南. 针对整个vn.py框架的学习,整体 ...
- Python编程初学者指南|百度网盘免费下载|Python新手入门资料
Python编程初学者指南|百度网盘免费下载 提取码:9ozx 目录 · · · · · · 第1章 启程:Game Over程序1.1 剖析Game Over程序1.2 Python简介1.2.1 ...
- JAVA开发者的Golang快速指南
Golang作为Docker.Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎.尤其它们都是开源的,很多情况下,开源是非常有价值的.深入学习阅Golang等源代码库 ...
- MessagePack Java 0.6.X 快速开始指南 - 安装
0.6.x 版本的 MessagePack 已经过期被淘汰了.如果你现在开始使用 MessagePack 话,请不要使用这个版本. 我们再这里保留 0.6.x 版本的内容主要用于参考用途. 最新的 M ...
- 树莓派4B踩坑指南 - (15)搭建在线python IDE
今天想在树莓派上自己搭一个在线的python IDE,于是找到了一篇教程--Fred913大神的从头开始制作OJ-在线IDE的搭建 自己尝试动手做了一下, 还是发现不少细节需要注意, 记录在此 如果不 ...
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- PEP 8 - Python代码样式指南
PEP 8 - Python代码样式指南 PEP: 8 标题: Python代码风格指南 作者: Guido van Rossum <python.org上的guido>,Barry Wa ...
- 机器学习实践:《Python机器学习实践指南》中文PDF+英文PDF+代码
机器学习是近年来渐趋热门的一个领域,同时Python 语言经过一段时间的发展也已逐渐成为主流的编程语言之一.<Python机器学习实践指南>结合了机器学习和Python 语言两个热门的领域 ...
- 阿里巴巴泰山版《Java 开发者手册》,也是一份防坑指南
我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...
- Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)
Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...
随机推荐
- Python趣味入门10:推倒繁琐化烦为简的推导式
前言 <西部世界>的德洛丽丝进入了MAZE迷宫,假设她需要列出一系列的平方数作为密码,来进入迷宫.在以往的代码生成类似的数列需要使用循环语句,写多行语句.Python有了推导式,只需要1句 ...
- Python——第二章:集合 Set
set集合,集合的特点是无序的 写法:s = {1,2,3} 但是如果内容是空的,它不是set集合,而是dict字典 s = {} print(type(s)) #输出结果 <class 'di ...
- Ubuntu系统部署后优化
Ubuntu系统配置调整 前期准备 #更改主机名,重启后不变 hostnamectl set-hostname Zabbix-Server01 #更改主机名,重启后变回从前 hostname Zabb ...
- Pulsar3.0新功能介绍
在上一篇文章 Pulsar3.0 升级指北讲了关于升级 Pulsar 集群的关键步骤与灾难恢复,本次主要分享一些 Pulsar3.0 的新功能与可能带来的一些问题. 升级后所遇到的问题 先来个欲扬先抑 ...
- 文心一言 VS 讯飞星火 VS chatgpt (39)-- 算法导论5.4 3题
三.在生日悖论的分析中,要求各人生日彼此独立是否很重要?或者,是否只要两两成对独立就足够了?证明你的答案. 文心一言: 在生日悖论的分析中,要求各人生日彼此独立是非常重要的.这是因为,如果各人生日不是 ...
- C# 将Excel转为OFD、UOS
本文以C#及VB.NET代码为例展示如何将Excel工作簿转换为OFD和UOS格式.通过workbook.LoadFromFile(string fileName)方法加载Excel源文档后,然后调用 ...
- C# 在Word中添加Latex 数学公式和符号
本篇内容介绍使用Spire.Doc for .NET在Word中添加Latex数学公式和符号的方法.编辑代码前,将Spire.Doc.dll文件添加引用至VS程序.dll文件包可通过官网下载导入(如果 ...
- 干货分享丨玩转物联网IoTDA服务系列六-恒温空调
摘要:本文主要讲述空调接入到物联网平台后,通过恒温空调控制系统,不论空调是否开机,都可以调整空调默认温度,待空调上电开机后,自动按默认温度调节. 场景简介 通过恒温控制系统,不论空调是否开机,都可以调 ...
- 数仓专家面对面 | 为什么我选择GaussDB(DWS)
摘要:你知道数仓是如何应运而生的吗?你了解数仓未来的发展趋势吗?想知道国内数仓专家的看法吗? 导语 数据仓库的发展一直是备受关注的议题,随着近年来技术的不断演进,数仓也在更新迭代. 你知道数仓是如何应 ...
- PyCharm View as Array 查看数组
代码中设置断点. 在Debug Variables 里面,点击 View as Array 如下图所示: