解决Python运算符重载的问题

作者:student_mei 时间:2022-07-04 23:09:33 

python进行有理数运算时,希望用运算符(+ - * /)描述计算过程。

只是用来写出更加自然的计算表达式。为此,python为所有算数运算符规定了特殊方法名。其中所有特殊的名字都以两个下划线开始,并以两个下划线结束,即:

当在Python中输入“a+b”时,程序发现使用了“+”运算符,因此就会调用“__add__”方法。

此时,若对自定义类中进行运算符的重载,则可以实现对类的打印、有理数运算等等。

其中,一个问题应当注意,如以下代码


class Size:
   def __init__(self, value):
       self._value = value
   def value(self):
       return self._value
   def __lt__(self, another):      #由于 < 是一个二元运算符,因此会有 anothoer这一项的存在
       cc = self.value() > another.value()
       return self.value() > another.value()

# def __gt__(self, another):
   #     gg = self._value < another.value()
   #     return self._value < another.value()

def __eq__(self, another):
       return self.value() == another.value()
   def __str__(self):
       return str(self.value())
a=Size(3)
b=Size(2)
print(a,b,a>b)

进行调试时,尽管没有对“>”运算符(对应的魔法方法是“__gt”)进行重载,但是运算到


print(a,b,a>b)

时,程序并不会报错,且仍然会调用重载后的"__lt__"。我个人理解是因为Python自动将“a>b”看成是“b<a”。若此时重载了“__gt__”,则程序不会去调用“__lt__”了。

补充:python中的运算符与表达式

Python是面向对象的编程语言,在Python中一切都是对象。对象由数据和行为两部分组成,而行为主要通过方法来实现,通过一些特殊方法的重写,可以实现运算符重载。

运算符也是表现对象行为的一种形式,不同类的对象支持的运算符有所不同,同一种运算符作用于不同的对象时也可能会表现出不同的行为,这正是“多态”的体现。

在Python中,单个常量或变量可以看作最简单的表达式,使用除赋值运算符之外的其他任意运算符和函数调用连接的式子也属于表达式

运算符优先级遵循的规则为:算术运算符优先级最高,其次是位运算符、成员测试运算符、关系运算符、逻辑运算符等,算术运算符遵循“先乘除,后加减”的基本运算原则。

虽然Python运算符有一套严格的优先级规则,但是强烈建议在编写复杂表达式时使用圆括号来明确说明其中的逻辑来提高代码可读性

解决Python运算符重载的问题

算数运算符

(1)+运算符除了用于算术加法以外,还可以用于列表、元组、字符串的连接,但不支持不同类型的对象之间相加或连接。

(2)*运算符除了表示算术乘法,还可用于列表、元组、字符串这几个序列类型与整数的乘法,表示序列元素的重复,生成新的序列对象。字典和集合不支持与整数的相乘,因为其中的元素是不允许重复的。

(3)运算符/和//在Python中分别表示算术除法和算术求整商(floor division)

(4)%运算符可以用于整数或实数的求余数运算,还可以用于字符串格式化,但是这种用法并不推荐。

(5)**运算符表示幂乘

来源:https://blog.csdn.net/qq_38308533/article/details/79934693

标签:Python,运算符,重载
0
投稿

猜你喜欢

  • 在SUSE10环境下安装和配置MySQL数据库

    2008-12-17 15:03:00
  • sqlserver中with(nolock)深入分析

    2024-01-27 13:39:48
  • python异常触发及自定义异常类解析

    2023-05-02 18:17:01
  • django在接受post请求时显示403forbidden实例解析

    2021-12-19 22:41:27
  • Python 正则 re.compile 真的必需吗

    2021-12-27 17:12:24
  • JavaScript caller与callee属性

    2009-01-19 13:39:00
  • 利用keras加载训练好的.H5文件,并实现预测图片

    2021-01-18 21:18:57
  • MySQL 查询的排序、分页相关

    2024-01-19 18:26:59
  • 一文带你了解ChatGPT API的使用

    2023-11-21 23:37:18
  • Python 页面解析Beautiful Soup库的使用方法

    2022-02-26 07:57:15
  • Python绘制正余弦函数图像的方法

    2022-09-22 19:59:06
  • 分享20个数据库设计的最佳实践

    2024-01-24 09:28:53
  • django 文件上传功能的相关实例代码(简单易懂)

    2023-01-14 03:51:17
  • Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止。

    2024-01-27 19:30:56
  • JavaScrpt的面向对象全面解析

    2024-04-23 09:20:40
  • PyCharm如何导入python项目的方法

    2022-10-23 05:50:35
  • Mysql到Elasticsearch高效实时同步Debezium实现

    2024-01-25 15:22:46
  • 对Python中for复合语句的使用示例讲解

    2023-07-19 17:50:44
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    2023-05-04 05:09:51
  • Go语言二进制文件的读写操作

    2023-06-23 09:40:08
  • asp之家 网络编程 m.aspxhome.com