Szukaj…


Przeciążenie operatora

Wszystko w Pythonie jest przedmiotem. Każdy obiekt ma specjalne metody wewnętrzne, których używa do interakcji z innymi obiektami. Zasadniczo metody te są zgodne z konwencją nazewnictwa __action__ . Łącznie jest to określane jako model danych w języku Python .

Możesz przeciążyć dowolną z tych metod. Jest to powszechnie stosowane w przypadku przeciążania operatora w Pythonie. Poniżej znajduje się przykład przeciążenia operatora za pomocą modelu danych Pythona. Klasa Vector tworzy prosty wektor dwóch zmiennych. Dodamy odpowiednie wsparcie dla operacji matematycznych dwóch wektorów wykorzystujących przeciążenie operatora.

class Vector(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, v):
        # Addition with another vector.
        return Vector(self.x + v.x, self.y + v.y)

    def __sub__(self, v):
        # Subtraction with another vector.
        return Vector(self.x - v.x, self.y - v.y)

    def __mul__(self, s):
        # Multiplication with a scalar.
        return Vector(self.x * s, self.y * s)

    def __div__(self, s):
        # Division with a scalar.
        float_s = float(s)
        return Vector(self.x / float_s, self.y / float_s)

    def __floordiv__(self, s):
        # Division with a scalar (value floored).
        return Vector(self.x // s, self.y // s)

    def __repr__(self):
        # Print friendly representation of Vector class. Else, it would
        # show up like, <__main__.Vector instance at 0x01DDDDC8>.
        return '<Vector (%f, %f)>' % (self.x, self.y, )

a = Vector(3, 5)
b = Vector(2, 7)

print a + b # Output: <Vector (5.000000, 12.000000)>
print b - a # Output: <Vector (-1.000000, 2.000000)>
print b * 1.3 # Output: <Vector (2.600000, 9.100000)>
print a // 17 # Output: <Vector (0.000000, 0.000000)>
print a / 17 # Output: <Vector (0.176471, 0.294118)>

Powyższy przykład pokazuje przeciążenie podstawowych operatorów numerycznych. Pełna lista znajduje się tutaj .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow