Python语言提供了运算符重载功能,增强了语言的灵活性。
?
Python语言本身提供了很多魔法方法,运算符重载就是通过重写这些内置魔法方法实现的。
这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,Python通过这种特殊的命名方式来拦截操作符,以实现重载。当Python的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作。
不同的类型相加会有不同的结果。
示例如下:
print(1 + 2)
print('1' + '2')
# 执行结果
# 3
# 12
对象的加法 需用运算符重载才有结果
示例如下:
class Person(object):
def __init__(self, num):
self.num = num
# 运算符重载
def __add__(self, other):
return Person(self.num + other.num)
def __str__(self):
return 'num = ' + str(self.num)
print(1 + 2)
print('1' + '2')
# 不同的类型用加法会有不同的结果
# 对象的加法 需用运算符重载才有结果
p1 = Person(2)
p2 = Person(5)
print(p1 + p2) # p1 + p2 ==== p1.__add__(p2)
重载方法列表如下:
Method | Overload | Call |
__init__ | 构造函数 | 对象创建:x = class(args) |
__del_ | 析构函数 | x对象收回 |
__add__ | 运算符+ | 如果没有_iadd_,X+Y,X+=Y |
__or__ | 运算符| | 如果没有_ior_,XIY,XI=Y |
__repr__,__str__ | 打印、转换 | print(X),repr(X),str(X) |
__call__ | 函数调用 | X(*args,**kwargs) |
__getattr__ | 点号运算 | X.undefined |
__setattr__ | 属性赋值语句 | X.any=value |
__dellattr__ | 属性删除 | del X.any |
__getattribute__ | 属性获取 | X.any |
__getitem__ | 索引运算 | X[key],X[i:j] |
__setitem__ | 索引赋值语句 | X[key],X[i:j]=sequence |
__delitem__ | 索引和分片删除 | del X[key],del X[i:j] |
__len__ | 长度 | len(X),如果没有_bool_,真值测试 |
__bool__ | 布尔测试 | bool(X) |
__lt__,__gt__ __le__, __ge__ __eq__,__ne__ | 特定比较 | X<Y,X>Y、X<=Y,X>=Y,X==Y,X!=Y |
__radd__ | 右侧加法 | other+X |
__Iadd__ | 实地(增强的)加法 | X+=Y(or else __add__) |
__iter_, _next__ | 迭代环境 | I=iter(X), next() |
__contains__ | 成员关系测试 | item in X(任何可迭代) |
__index__ | 整数值 | hex(X), bin(X),oct(x) |
__enter__,___exit__ | 环境管理器 | with obj as var: |
__get_,__set__,__delete__ | 描述符属性 | X.attr, X.attr=value, del X.attr |
__new__ | 创建 | 在_init_之前创建对象 |
Python 面向对象运算符的内容整理