0
点赞
收藏
分享

微信扫一扫

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



文章目录

  • ​​一、运算符重载​​

一、运算符重载

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

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一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。



举报

相关推荐

0 条评论