【愚公系列】2021年12月 Python教学课程 23-面向对象编程-运算符重载
【摘要】 一、运算符重载运算符重载,是对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型。运算符重载,是为了让用户自定义的对象能够使用中缀运算符(如+,-,*,&等)或一元运算符(如~)等。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)