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中是完全面向对象的语言,程序中出现的数值1
和2
以对象的形式存储,那么加号+
是一个普通的加号么?应该不是的,两个对象要怎么加?正常情况下,运算符是作用在基础数据类型。实际上:a + b
和a.__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
程序说明:
- 首先定义了类Person,包含两个实例属性:
name
和age
,重载了__str__(self)
方法对对象信息输出,__add__(self, other)
对对象之间的加法操作进行处理。 - 实例化两个对象:p1和p2,分别调用
__str__(self)
方法输出对象信息,结果也是正常输出。 - 最后执行
sum_age = p1 + p2
,由于p1和p2都是Person的实例,在类Person
中由于重载了__add__(self, other)
,不会报错,会把年龄属性进行相加,得到最后的结果:200
,并输出打印。
备注:
更多精彩博客,请访问:聂发俊的技术博客
对应视频教程,请访问:python400
完整markdown笔记,请访问: python400_learn_github