Python小知识之对象的比较

简介: Python小知识之对象的比较

好久不见


国庆回了趟老家,躺平了10天。作息时间基本和小学生差不多,8、9点就睡了, 那滋味别提多舒服了。时间也和小时候过得一样慢了...长时间不更新,还是不行滴,粉都快掉没了。

今天就结合日常生活的例子,给大家讲讲Python对象之间的比较。(内容不多,小娃儿都能看懂

场景

米洛今年国庆节打算给新家添置一些日用的东西,比如床、四件套等等。为此,他使用了各大电商平台的app,但因为是新家,所以有些app还没有录入地址。

于是他干脆进行了一波整理,在他的收货地址里面,找寻自己是否添加过最新的地址。

4.jpg

他去掉了一些失效地址

我们都知道,收货地址最重要的就是地址+电话了,通过这个可以确定一个人。因为有些英雄美女喜欢把姓名写成: 喵星人吴彦祖这样的,所以只要确保地址和电话对得上就行。

那我们就需要比较地址是否有重复的,这样就好好管理自己的收货地址嘛。

代码里的收货地址


我们定义一个Receiver类,里面有name/address/mobile3个字段:


class Receiver(object):
    def __init__(self, name, addr, mobile):
        self.name = name
        self.addr = addr
        self.mobile = mobile
if __name__ == "__main__":
    r = Receiver("小孟", "梅苑小区", 13922222222)
    r2 = Receiver("小孟货", "梅苑小区", 13922222222)
    print(r == r2)

这样我们的生活就映射到了代码之中。由于我们要比较,所以我们这边new了2个收货地址

我们想要的是,当addr和mobile一致的时候,我们确定这2个收货地址相同

来看看执行效果:

5.jpg

可以看到,并不ok

因为r和r2是2个不同的对象,所以他们是肯定不相等的。

思考: 如果是单例模式的class,r等于r2吗?

了解eq方法


我们知道,在Python里面比较数字/字符串是否相等,那2个对象是否相等。其实也是可以比较的。这一切都要归功于__eq__这个方法。

6.jpg

我们编写__op__方法

可以看到有个向上的箭头,这个代表子类重写了父类的方法。我们点击一下:

7.jpg

可以看到跳转到了object的定义,而Python的类都是继承自object的,所以子类也就带有了__eq__方法

在我们比较2个对象的时候: r == r2, 实际上是执行了这样的方法:


r.__eq__(r2)

不信咱们试试:

8.jpg

image

实现


熟悉了eq以后,我们问题就迎刃而解了。我们只需要在eq方法里面写上对应的判断方法即可。


class Receiver(object):
    def __init__(self, name, addr, mobile):
        self.name = name
        self.addr = addr
        self.mobile = mobile
    def __eq__(self, other):
        return self.addr == other.addr and self.mobile == other.mobile
if __name__ == "__main__":
    r = Receiver("小孟", "梅苑小区", 13922222222)
    r2 = Receiver("小孟", "梅苑小区", 13922222222)
    print(r == r2)

9.jpg

image

扩展


既然能够比较对象是否相等,那能否比较对象大小呢?那就等大家自己探索了,关键字:

lt, gt, ge, le

另外,还有__str__, __repr__, __hash__等方法,大家感兴趣也可以自己重写着玩玩。



相关文章
|
10天前
|
程序员 Ruby Python
Python里的类和对象是什么?
本文介绍了Python中面向对象编程的核心概念——类与对象。类作为一种“蓝图”,定义了一组属性和方法,用于描述一类对象的共同特征与行为。通过类可以创建具体的对象实例,每个对象拥有类所定义的属性和方法。文章通过`Human`类的例子详细展示了如何定义类、初始化对象及其属性、定义方法,以及如何给对象添加自定义属性。此外,还介绍了如何通过类创建多个具有不同特性的对象实例,并探讨了属性覆盖和使用`@property`装饰器实现只读属性的方法。
|
26天前
|
Python
Python中使用类和对象
【7月更文挑战第23天】
18 6
|
12天前
|
Python
【python笔记】使用zip函数迭代多个可迭代对象
【python笔记】使用zip函数迭代多个可迭代对象
|
1月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型:图像语义分割与对象检测
【7月更文挑战第15天】 使用Python实现深度学习模型:图像语义分割与对象检测
40 2
|
1月前
|
Python
|
1月前
|
存储 JSON 测试技术
python中json和类对象的相互转化
针对python中类对象和json的相关转化问题, 本文介绍了4种方式,涉及了三个非常强大的python库jsonpickle、attrs和cattrs、pydantic,但是这些库的功能并未涉及太深。在工作中,遇到实际的问题时,可以根据这几种方法,灵活选取。 再回到结构化测试数据的构造,当需要对数据进行建模时,也就是赋予数据业务含义,pydantic应该是首选,目前(2024.7.1)来看,pydantic的生态非常活跃,各种基于pydantic的工具也非常多,建议尝试。
|
2月前
|
算法 Java 程序员
Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A->B->A)可导致内存泄漏。
【6月更文挑战第20天】Python内存管理用引用计数(对象的`ob_refcnt`)跟踪对象,但循环引用(如A->B->A)可导致内存泄漏。为解决此问题,Python使用`gc`模块检测并清理循环引用,可通过`gc.collect()`手动回收。此外,Python结合标记清除和分代回收策略,针对不同生命周期的对象优化垃圾回收效率,确保内存有效释放。
23 3
|
1月前
|
Python
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
1月前
|
存储 Python
语音输入,python数据类型,type()用来查看数据类型,数据类型转换,int(x)转整数,float(x)转换为浮点数,str(x),将对象转为字符串,标识符,标识符不允许使用关键字,关键字参考
语音输入,python数据类型,type()用来查看数据类型,数据类型转换,int(x)转整数,float(x)转换为浮点数,str(x),将对象转为字符串,标识符,标识符不允许使用关键字,关键字参考
|
2月前
|
算法 Java 程序员
Python面相对象的编程
Python面相对象的编程