83、Python之鸭子类型:比较运算符重载&自定义类型实现比较运算

引言

在Python中的鸭子类型理念,以及魔法函数(或者称之为魔术方法)系统的加持下,开发者自定义的类型可以拥有任何内置类型的特性,出现在几乎任何想要出入的语法单元,表现得完全像内置类型一样。

所以,有一种说法,所谓的“魔术方法”,更应该称之为“麻瓜方法”。我们每个开发者,不需要具备Python解释器或者内置模块的魔法,就可以实现内置模块的行为、特性。

本文接着就鸭子类型进行展开,来聊一下比较运算的支持。

本文的主要内容有:

1、比较运算符概览

2、比较运算符重载

3、通过魔术方法实现比较运算

比较运算符概览

先说点题外话。

计算机科学是以数学为其理论基础的,早期的编程语言也是很纯粹地为了解决一些数学问题。即便计算机科学发展了这么多年,各种编程语言、新的技术层出不穷,计算机所能解决的问题看似覆盖了各个领域,其本质始终没有突破。也就是说,计算机所能解决的各种问题,本质上都是先转换成了数学问题或者数学形式语言的表达,才能最终通过计算机来解决。

数学领域中,一个关键特性在于可量化。在可量化的基础上有了计算的基石——四则运算,然后组合出了各种复杂的运算。

除了四则运算,可量化还带来了可比较的特性,继而有了各种比较运算。

今天,我们先来聊下比较运算。

任何编程语言,都会有对比较运算的支持,而且形式也都是大同小异。常见的比较运算是基于大于、小于、等于的组合实现,主要有:

1、相等运算,通常是==,英文为eq,equal的缩写。

2、不相等运算,通常为!=,也有<>的形式,英文为ne,not equal的缩写。

3、小于运算,通常为<,英文为lt,little than的缩写。

4、小于等于运算,通常为<=,英文为le,little or equal的缩写。

5、大于运算,通常为>,英文为gt,great than的缩写。

6、大于等于运算,通常为>=,英文为ge,great or equal的缩写。

比较运算符重载

在编程语言中,各种基本类型是自动支持运算比较的,比如整型、浮点型,字符串类型通常也是可以比较的。

但是,我们自定义的类型,默认情况下,是无法支持比较运算的。

class DaGongRen:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height


print(100 > 99999)
print(4.0 <= 4.1)
print('abc' > 'abb')
print(DaGongRen('张三', 18, 175) < DaGongRen('李四', 23, 165))

执行结果:

12dd4e6104dc4e980642922c8f181acc.jpeg

当然,在一些编程语言中,也提供了自定义类型支持比较运算符的方法,比如:C++。这种方法,通常叫做运算符重载。

所谓“运算符重载(Operator Overloading)”,是面向对象编程的一种技术,允许开发者定义或者改变运算符在自定义对象上的行为。通过运算符重载,可以使得自定义类的实例与内置数据类型一样使用运算符,从而使得代码更加直观、易读。

Python中虽然不提供C++中类似的运算符重载的功能实现,但是通过魔术方法,使得自定义类型支持运算符操作,能够更加简洁、直观。

通过魔术方法实现比较运算

Python中针对每一种比较运算符,都有对应的魔术方法,下面简单列举一下:

1、__eq__(self, other):相等运算,==。

2、__ne__(self, other):不相等运算,!=。

3、__lt__(self, other):小于运算,<。

4、__le__(self, ohter):小于等于运算,<=。

5、__gt__(self, other):大于运算,>。

6、__ge__(self, other):大于等于运算,>=。

下面,通过代码实例看一下这些魔术方法的作用。

class DaGongRen:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __ne__(self, other):
        return self.age != other.age

    def __lt__(self, other):
        return self.age < other.age

    def __le__(self, other):
        return self.age <= other.age

    def __gt__(self, other):
        return self.age > other.age

    def __ge__(self, other):
        return self.age >= other.age

    def __repr__(self):
        return f'打工人(name={self.name}, age={self.age})'


if __name__ == '__main__':
    zs = DaGongRen('张三', 18)
    ls = DaGongRen('李四', 23)
    ww = DaGongRen('王五', 18)
    print(zs < ls)
    print(ls > zs)
    print(ww == zs)
    dgrs = [zs, ls, ww]
    print(dgrs)
    dgrs.sort()
    print(dgrs)

运行结果:

4805aeeca4bffa48342f8a792b73a1ca.jpeg

总结

本文简单介绍了编程中的比较运算,以及运算符重载的概念。然后,结合Python中的魔术方法,介绍了Python自定义类型,支持比较运算的实现。

感谢您的拨冗阅读,希望对您有所帮助!

7b04e4f70970c2ef18ff35dd7717b42d.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值