示例代码:
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中的运算符号实际是对象中定义的特定名称方法,对象可以通过实现这些方法,就能实现对应的运算功能。
示例代码(命令行运行):
>>> 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程序说明: 命令行程序把表格中把整理的运算符号都全部实现了一遍。
示例代码:
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个比较运算符对应的方法。
关于剩下的特殊方法和特殊属性会在下一篇文章中说明。
示例代码:
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