【愚公系列】2021年12月 Python教学课程 23-面向对象编程-运算符重载

举报
愚公搬代码 发表于 2021/12/15 09:56:49 2021/12/15
【摘要】 一、运算符重载运算符重载,是对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型。运算符重载,是为了让用户自定义的对象能够使用中缀运算符(如+,-,*,&等)或一元运算符(如~)等。Python 语言提供了运算符重载功能,增强了语言的灵活性。Python 语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些 Python 内置魔法方法实现的。这些魔法方法都是以双下划线开...

一、运算符重载

运算符重载,是对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型。运算符重载,是为了让用户自定义的对象能够使用中缀运算符(如+,-,*,&等)或一元运算符(如~)等。

Python 语言提供了运算符重载功能,增强了语言的灵活性。Python 语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些 Python 内置魔法方法实现的。这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,python 通过这种特殊的命名方式来拦截操作符,以实现重载。当 Python 的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作。

常见运算符重载方法

方法 重构 调用
__init__ 构造函数 对象建立:X = Class(args)
__del__ 析构函数 X对象收回
__add__ 运算符+ 如果没有_iadd_, X + Y, X += Y
__or__ 运算符(位OR) 如果没有 _ior_, X
__repr__, __str__ 打印,转换 print(X), repr(X), str(X)
__call__ 函数调用 X(*args, **kargs)
__getattr__ 点号运算 X.undefined
__setattr__ 属性赋值语句 X.any = value
__delattr__ 属性删除 del X.any
__getattribute__ 属性获取 X.any
__getitem__ 索引运算 X[key], X[i:j], 没__iter__时的for循环和其他迭代器
__setitem__ 索引赋值语句 X[key] = value, X[i:j] = sequence
__delitem__ 索引和分片删除 del X[key], del X[i:j]
__len__ 长度 len(X), 如果没有__bool__, 真值测试
__bool__ 布尔测试 bool(X), 真测试(在python2.6中叫做_
__lt__, __gt__ 特定比较 X < Y, X > Y, X <= Y, X >= Y
__le__, __ge__ 特定比较 X == Y, X != Y
__radd__ 右侧加法 other + X
__iadd__ 实地(增强的)加法 X += Y (or else add
__iter__, __next__ 迭代环境 I = iter(X), next(I); for loops,
__contains__ 成员关系测试 item in X(任何可迭代的对象)
__index__ 整数值 hex(X), bin(X), oct(X), O[X], O[X:]
__enter__, __exit__ 环境管理器 with obj as var:
__get__, __set__ 描述符属性 X.attr, X.attr = value, del X.value
__delete__ 描述符属性 descr.__delete__(self, obj) –> None
__new__ 创建 __init__之前创建对象

类可以重载加减运算、打印、函数调用、索引等内置运算,运算符重载使我们的对象的行为与内置对象的一样。Python 在调用操作符时会自动调用这样的方法,例如,如果类实现了__add__方法,当类的对象出现在+运算符中时会调用这个方法。

# 先看看原list加号运算符
>>> lst = list()
>>> lst.append(1)
>>> lst
[1]
>>> lst + [2]
>>> lst
[1, 2]

# 重构`+`号运算符方法__add__
class A(list):
    def __add__(self, other):
        print 'Hello, Python.'

>>> newlst = A()
>>> newlst.append(1)
>>> newlst + [2]
Hello, Python.
>>> newlst
[1]

我们在类A中重载了列表+号运算符的方法__add__,它只输出Hello, Python.,所以当我们类A的实例对象newlst调用+号运算符时,并没有像lst一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。