Python运算符重载介绍
运算符重载(Operator Overloading)允许程序员对现有的运算符进行重新定义,使其能够适用于自定义的数据类型和类。在Python官方文档中,通常将运算符重载称之为"Emulating numeric types"或者"Emulating container types"。它的意义是通过特殊方法(add、mul、__getitem__等)使得用户自定义的类对象可以模拟数字类型或容器类型的行为。https://docs.python.org/3/reference/datamodel.html#emulating-numeric-types
在 Python 中,可以通过在自定义类中定义特殊的方法来实现运算符重载。运算符重载也称为操作符重载。操作符重载是指通过定义特定的方法,让自定义对象能够使用内置操作符进行运算。通过操作符重载,您可以为不同的对象类型定义不同的运算规则,使得对象之间的运算更加灵活和直观。
在Python中,使用特殊方法(也称为魔术方法或双下划线方法)来实现运算符重载。这些特殊方法的名称是预定义的,以双下划线开头和结尾,并与相应的运算符相对应(例如,加法操作的特殊方法是__add__())
例如,add()方法可以被定义来重载"+"运算符。当对应的实例进行加法操作时,Python将自动调用__add__()方法来执行其自定义行为。同样,sub()、mul()和__div__()等方法也可以用来重载其他的运算符。
下面是重载"+"运算符实现向量加法的示例源码:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3.x, v3.y) # 输出:4 6
这段代码的功能是创建一个名为 Vector 的自定义类,用于表示二维向量。该类重载了 __add__ 方法——重载"+"运算符,允许对两个 Vector 类型的实例进行加法运算。当尝试对两个向量对象进行加法运算时,Python 会自动调用 __add__ 方法,从而实现向量之间的加法运算。
作为对比,下面改用C++或Java实现重载"+"运算符实现向量加法的源码。
★使用 C++ 实现重载"+"运算符实现向量加法:
#include <iostream>
using namespace std;
class Vector {
public:
Vector(int x, int y) : x(x), y(y) {}
Vector operator+(const Vector& other) const {
return Vector(x + other.x, y + other.y);
}
int getX() const {
return x;
}
int getY() const {
return y;
}
private:
int x;
int y;
};
int main() {
Vector v1(1, 2);
Vector v2(3, 4);
Vector v3 = v1 + v2;
cout << v3.getX() << " " << v3.getY() << endl; // 输出:4 6
return 0;
}
★使用 Java 实现重载"+"运算符实现向量加法:
public class Vector {
private int x;
private int y;
public Vector(int x, int y) {
this.x = x;
this.y = y;
}
public Vector add(Vector other) {
return new Vector(x + other.x, y + other.y);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public static void main(String[] args) {
Vector v1 = new Vector(1, 2);
Vector v2 = new Vector(3, 4);
Vector v3 = v1.add(v2);
System.out.println(v3.getX() + " " + v3.getY()); // 输出:4 6
}
}
OK!