English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Sie können die Bedeutung von Operatoren in Python ändern, basierend auf den Operanden, die Sie verwenden. Dies wird als Operator-Überladung bezeichnet.
Python-OperatorFür eingebettete Klassen. Aber derselbe Operator verhält sich unterschiedlich für verschiedene Typen. Zum Beispiel,+Der Operator führt Arithmetische Addition auf zwei Zahlen aus, kombiniert zwei Listen und verbindet zwei Zeichenfolgen.
Diese Funktion in Python ermöglicht es, dass derselbe Operator je nach Kontext unterschiedliche Bedeutungen hat, was als Operator-Überladung bezeichnet wird.
Was passiert, wenn wir sie mit Objekten von benutzerdefinierten Klassen verwenden? Sehen wir uns die folgende Klasse an, die versucht, einen Punkt in einem zweidimensionalen Koordinatensystem zu modellieren.
class Point: def __init__(self, x = 0, y = 0): self.x = x self.y = y
Führen Sie nun den Code aus und versuchen Sie, zwei Punkte im Python-Shell hinzuzufügen.
>>> p1 = Point(2,3) >>> p2 = Point(-1,2) >>> p1 + p2 Traceback (most recent call last): ... TypeError: Unsupported operand types for +: 'Point' und 'Point'
Wow! Das sind viele Fehler. Ein TypeError wird ausgelöst, da Python nicht weiß, wie man zwei Point-Objekte zusammen addiert.
Die gute Nachricht ist, dass wir Python dies durch Operator-Überladung beibringen können. Aber zunächst sollten wir uns mit den speziellen Funktionen vertraut machen.
Klassenfunktionen, die mit einem doppelten Unterstrich __ beginnen, werden in Python als spezielle Funktionen bezeichnet. Dies liegt daran, dass sie keine gewöhnlichen Funktionen sind. Der von uns oben definierte __init__() -Funktion ist eine davon. Er wird jedes Mal aufgerufen, wenn wir ein neues Objekt dieser Klasse erstellen. In Python gibt es viele spezielle Funktionen.
Using special functions, we can make our class compatible with built-in functions.
>>> p1 = Point(2,3) >>> print(p1) <__main__.Point object at 0x00000000031F8CC0>
The print output did not achieve the expected effect. However, if we define the __str__() method in the class, we can control its print output. We add this to our class.
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)
Now, let's try the function again with print().
>>> p1 = Point(2,3) >>> print(p1) (2,3)
It turns out that it is better when we use the built-in functions str() or format(), as they call the same method format().
>>> str(p1) '('2,3)' >>> format(p1) '('2,3)'
Therefore, when you execute str(p1) or format(p1) Python internally executes p1__str__() are called special functions. Let's continue with operator overloading.
to overload+symbol, we will need to implement the __add__() function in the class. With rights come great responsibilities. We can do anything we like within this function. However, it is wise to return a Point object that is the sum of the coordinates.
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)
Now, let's try again.
>>> p1 = Point(2,3) >>> p2 = Point(-1,2) >>> print(p1 + p2) (1,5)
What actually happens is, when you execute p1 + p2when Python will call p1 __add__(p2), which is Point.__add__(p1, p2). Similarly, we can also overload other operators. The list of special functions that we need to implement is as follows.
operators | expression | Internally |
---|---|---|
Addition (+) | p1 + p2 | p1 __add__(p)2) |
Subtraction (-) | p1-p2 | p1 __sub__(p)2) |
Multiplication (*) | p1 * p2 | p1 __mul__(p)2) |
Power (**) | p1 ** p2 | p1 __pow__(p)2) |
Division (/) | p1 / p2 | p1 __truediv__(p)2) |
Floor division (//) | p1 // p2 | p1 __floordiv__(p)2) |
Modulus (%) | p1%p2 | p1 __mod__(p)2) |
Bitwise left shift (<<) | p1 << p2 | p1 __lshift__(p)2) |
Bitwise right shift (>>) | p1 >> p2 | p1 __rshift__(p)2) |
Bitweise Und (AND) | p1 and p2 | p1 __ and __(p2) |
Bitweise Oder (OR) | p1 | 2 | p1 __ or __(p2) |
Bitweise Exklusiv-Oder (XOR) | p1 ^ p2 | p1 __ xor __(p2) |
Bitweise Negation(~) | ~p1 | p1 __ invert __() |
Python beschränkt die Überladung von Operatoren nicht auf arithmetische Operatoren. Wir können auch Vergleichsoperatoren überladen.
Angenommen, wir möchten den Vergleichsoperator (<) in der Point-Klasse implementieren. Lassen Sie uns die Punkte von Nullpunkt aus vergleichen und das Ergebnis zu diesem Zweck zurückgeben. Dies kann wie folgt implementiert werden.
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
Versuchen Sie, diese Beispiele im Python-Shell auszuführen.
>>> Point(1,1) < Point(-2,-3) True >>> Point(1,1) < Point(0.5,-0.2) False >>> Point(1,1) < Point(1,1) False
Ähnlich wie, unten sind die speziellen Funktionen aufgeführt, die wir implementieren müssen, um andere Vergleichsoperatoren zu überladen.
Operator | Ausdruck | Intern |
---|---|---|
Kleiner als (<) | p1 <p2 | p1 __ lt __(p2) |
Kleiner als oder gleich (<=) | p1 <= p2 | p1 __ le __(p2) |
Gleichheit (==) | p1 == p2 | p1 __ eq __(p2) |
Nicht gleich (!=) | p1!= p2 | p1 __ ne __(p2) |
Größer als (>) | p1> p2 | p1 __ gt __(p2) |
Größer als oder gleich (>=) | p1> = p2 | p1 __ ge __(p2) |