• Python小知识之对象的比较


    好久不见

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

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

    场景

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

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

    他去掉了一些失效地址

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

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

    代码里的收货地址

    我们定义一个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个收货地址相同

    来看看执行效果:

    可以看到,并不ok

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

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

    了解__eq__方法

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

    我们编写__op__方法

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

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

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

    r.__eq__(r2)
    

    不信咱们试试:

    实现

    熟悉了__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)
    

    扩展

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

    lt, gt, ge, le

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

  • 相关阅读:
    修复mac os中的home键和end键
    利用numpy实现list降维
    string与StringBuilder的区别
    mysql 版本,mysqlconnectorjava, application.xml 的 driverclassname 的依赖关系
    linux下创建新用户新数据库并远程访问
    谷歌的JS编码规范链接
    sed命令之多行拷贝
    box2dWeb引擎案例
    SQL Server数据库镜像笔记
    团队项目系统设计
  • 原文地址:https://www.cnblogs.com/we8fans/p/15398426.html
Copyright © 2020-2023  润新知