English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 基础教程

Python 流程控制

الوظائف في بايثون

أنواع البيانات في بايثون

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

تحميل العمليات في بايثون

您可以根据所使用的操作数来更改Python中运算符的含义。 这种做法称为运算符过载。

什么是Python中的运算符重载?

عناصر حسابية لـ Python用于内置类。但是相同的运算符对不同的类型有不同的行为。例如,+运算符将对两个数字执行算术加法、合并两个列表并连接两个字符串。

Python中的这一功能允许同一运算符根据上下文具有不同的含义,称为运算符重载。

那么,当我们将它们与用户定义类的对象一起使用时会发生什么呢?让我们看下面的类,它试图在二维坐标系中模拟一个点。

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y

现在,运行代码并尝试在Python shell中添加两个点。

>>> p1 = Point(2,3)
>>> p2 = Point(-1,2)
>>> p1 + p2
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'

哇!这是很多错误。由于Python不知道如何将两个Point对象加在一起而引发TypeError。

但是,好消息是我们可以通过运算符重载向Python教授这一点。但是首先,让我们对特殊函数有所了解。

Python中的特殊函数

以双下划线__开头的类函数在Python中称为特殊函数。这是因为,它们不是普通的函数。我们上面定义的__init__()函数就是其中之一。每次我们创建该类的新对象时都会调用它。Python中有很多特殊函数。

使用特殊函数,我们可以使我们的类与内置函数兼容。

>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>

打印输出没有达到预想的效果。但是,如果我们在类中定义__str__()方法,我们可以控制它的打印输出方式。我们把这个加到我们的类中。

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    
    def __str__(self):
        return "{0},{1}".format(self.x,self.y)

现在,让我们print()再次尝试该函数。

>>> p1 = Point(2,3)
>>> print(p1)
(2,3)

 事实证明这样更好,当我们使用内置函数str()或时,将调用相同的方法format()。

>>> str(p1)
'(2,3)'
>>> format(p1)
'(2,3)'

因此,当您执行str(p1)或format(p1)时,Python在内部执行p1.__str__()。因此得名,特殊函数。下面继续回到操作符重载。

在Python中重载+运算符

要重载+符号,我们将需要在类中实现__add__()函数。拥有权利的同时也被赋予了重大的责任。我们可以在此函数内做任何喜欢的事情。 但是返回坐标和的Point对象是明智的。

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    
    def __str__(self):
        return "{0},{1}".format(self.x,self.y)
    
    def __add__(self,other):
        x = self.x + other.x
        y = self.y + other.y
        return Point(x,y)

现在,让我们再试一次。

>>> p1 = Point(2,3)
>>> p2 = Point(-1,2)
>>> print(p1 + p2)
(1,5)

实际上发生的是,当您执行p1 + p2时,Python会调用p1 .__ add __(p2),也就是Point .__ add __(p1,p2)。 同样,我们也可以重载其他运算符。 我们需要实现的特殊函数列表如下。

Python中运算符重载的特殊函数
运算符表达在内
相加(+)p1 + p2p1 .__ add __(p2)
相减(-)p1-p2p1 .__ sub __(p2)
相乘(*)p1 * p2p1 .__ mul __(p2)
求幂(**)p1 ** p2p1 .__ pow __(p2)
相除(/)p1 / p2p1 .__ truediv __(p2)
整除(//)
p1 // p2p1 .__ floordiv __(p2)
求模 (%)p1%p2p1 .__ mod __(p2)
按位左移(<<)p1 << p2p1 .__ lshift __(p2)
按位右移(>>)p1 >> p2p1 .__ rshift __(p2)
按位与(and)p1 and p2p1 .__ and __(p2)
按位或(or)p1 | 2p1 .__ or __(p2)
按位异或(^)p1 ^ p2p1 .__ xor __(p2)
按位否(~)〜p1p1 .__ invert __()

تحميل العمليات المقارنة في Python

لا يقييد Python تحميل العمليات الحسابية فقط للمحاسبات الارithmetic. يمكننا أيضًا تحميل العمليات المقارنة.

افترض، نريد تنفيذ عمليات مقارنة أصغر (<) في فئة Point، لنقارن حجم هذه النقاط من نقطة الصفر ونقوم بذلك من أجل هذا الهدف. يمكن تنفيذ ذلك كما يلي.

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    
    def __str__(self):
        return "{0},{1}".format(self.x,self.y)
    
    def __lt__(self,other):
        self_mag = (self.x ** 2) + (self.y ** 2)
        other_mag = (other.x ** 2) + (other.y ** 2)
        return self_mag < other_mag

حاول تشغيل هذه الأمثلة في محطة Python.

>>> Point(1,1) < Point(-2,-3)
True
>>> Point(1,1) < Point(0.5,-0.2)
False
>>> Point(1,1) < Point(1,1)
False

بشكل مماثل، يلي قائمة بالوظائف الخاصة التي نحتاج إلى تنفيذها لتحميل العمليات المقارنة الأخرى.

تحميل مقارنات العمليات في Python
ميزة
عبرةداخلي
أصغر (<)p1 < p2p1 .__ lt __ (p2)
أصغر أو يساوي (<=)p1 <= p2p1 .__ le __ (p2)

متساوي (==)

p1 == p2p1 .__ eq __ (p2)
غير متساوي (!=)p1 != p2p1 .__ ne __ (p2)
أكبر (>)p1 > p2p1 .__ gt __ (p2)
أكبر أو يساوي (>=)p1 >= p2p1 .__ ge __ (p2)