1.引题

示例代码:

a = 1
b = 2
# 程序员使用的写法
c = a + b
print("c=", c, sep="")

# 实际调用的方法
d = a.__add__(b)
print("d=", d, sep="")

运行结果:

c=3
d=3

程序说明:
这个是最基本的程序,程序的运行加法的结果就不过多解释了。首先我们先想一个问题,Python中是完全面向对象的语言,程序中出现的数值12以对象的形式存储,那么加号+是一个普通的加号么?应该不是的,两个对象要怎么加?正常情况下,运算符是作用在基础数据类型。实际上:a + ba.__add__(b)是等效的两种方式,用一个简单的操作来说明:在Pycharm中,Windows系统按住Ctrl键(MacOS系统按住Command),点击a + b中间的+号,发现会进入如下的源代码:

    def __add__(self, *args, **kwargs): # real signature unknown
        """ Return self+value. """
        pass

说明:Python中的运算符号实际是对象中定义的特定名称方法,对象可以通过实现这些方法,就能实现对应的运算功能。

2.常见运算符号

2.1 常见运算符号整理

运算符对应特殊方法说明
运算符+__add__加法
运算符-__sub__减法
<, <=, ==__lt__, __le__, __eq__比较运算符
>, >=, !=__gt__, __ge__, __ne__比较运算符
|, ^, &__or__, __xor__, __and__位运算或、异或、与
<<>>__lshift__, __rshift__左移操作、右移操作
*, /, %, //__mul__, __truediv__, __mod__, __floordiv__乘、浮点除、模运算(求余)、整数除
**__pow__指数运算

2.2 常见运算符号操作

示例代码(命令行运行):

>>> a = 12
>>> b = 4
>>> a + b
16
>>> a.__add__(b)
16
>>> a - b
8
>>> a.__sub__(b)
8
>>> a < b
False
>>> a.__lt__(b)
False
>>> a <= b
False
>>> a.__le__(b)
False
>>> a == b
False
>>> a.__eq__(b)
False
>>> a > b
True
>>> a.__gt__(b)
True
>>> a >= b
True
>>> a.__ge__(b)
True
>>> a != b
True
>>> a.__ne__(b)
True
>>> a | b
12
>>> a.__or__(b)
12
>>> a ^ b
8
>>> a.__xor__(b)
8
>>> a & b
4
>>> a.__and__(b)
4
>>> a << 1
24
>>> a.__lshift__(1)
24
>>> a >> 1
6
>>> a.__rshift__(1)
6
>>> a * b
48
>>> a.__mul__(b)
48
>>>
>>> a / b
3.0
>>> a.__truediv__(b)
3.0
>>> a % b
0
>>> a.__mod__(b)
0
>>> a // b
3
>>> a.__floordiv__(b)
3
>>> import math
>>> pow(a, 2)
144
>>> a.__pow__(2)
144

程序说明: 命令行程序把表格中把整理的运算符号都全部实现了一遍。

2.3 object根类默认实现的运算符号

示例代码:

obj = object()
print(dir(obj))

运行结果:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

程序说明:
通过结果我们看到,'__eq__','__ge__','__gt__','__le__','__lt__','__ne__',这6个运算符号对应着表格中比较运算符,又因为object类是所有类的根类,也就是说任何一个对象中都至少包含这6个比较运算符对应的方法。

关于剩下的特殊方法和特殊属性会在下一篇文章中说明。

3.运算符号重载

示例代码:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return "name={0},age={1}".\
            format(self.name, self.age)

    def __add__(self, other):
        if isinstance(other, Person):
            return self.age + other.age
        else:
            return "不同类型的对象,不能进行相加操作"

p1 = Person("聂聂", 100)
print(p1)
print("--" * 20)

p2 = Person("俊俊", 100)
print(p2)
print('--' * 20)

sum_age = p1 + p2
print(sum_age)

运行结果:

name=聂聂,age=100
----------------------------------------
name=俊俊,age=100
----------------------------------------
200

程序说明:

  1. 首先定义了类Person,包含两个实例属性:nameage,重载了__str__(self)方法对对象信息输出,__add__(self, other)对对象之间的加法操作进行处理。
  2. 实例化两个对象:p1和p2,分别调用__str__(self) 方法输出对象信息,结果也是正常输出。
  3. 最后执行sum_age = p1 + p2,由于p1和p2都是Person的实例,在类Person中由于重载了__add__(self, other),不会报错,会把年龄属性进行相加,得到最后的结果:200,并输出打印。

备注:
更多精彩博客,请访问:聂发俊的技术博客
对应视频教程,请访问:python400
完整markdown笔记,请访问: python400_learn_github