Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Operator overloading in Python beheersen: een praktische gids

Python Operator Overloading

Ontdek hoe je operatorgedrag in Python kunt herdefiniëren met speciale methoden zoals __add__, __lt__ en meer, om je OOP-ontwerpen te verbeteren.

Python Operator Overloading

Python's ingebouwde operators werken verschillend afhankelijk van operand-typen. De +-operator telt getallen op, concateneert strings of mergt lijsten. Deze flexibiliteit wordt bereikt via operator overloading – een feature die je context-specifieke betekenissen aan operators toewijst voor je eigen klassen.

Overweeg een simpele Punt-klasse die een coördinaat in een 2-D vlak vertegenwoordigt. Zonder speciale methoden zal het proberen om twee punten op te tellen een TypeError opleveren:

class Punt:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y
p1 = Punt(1, 2)
p2 = Punt(2, 3)
print(p1+p2)

Uitvoer

Traceback (most recent call last): File "<string>", line 9, in <module> print(p1+p2) TypeError: unsupported operand type(s) for +: 'Punt' and 'Punt'

Omdat Python geen ingebouwde kennis heeft over het combineren van twee Punt-instanties, gooit het een exception. Operator overloading laat ons dat gedrag zelf definiëren.


Python Speciale Methodes

Methoden omringd door dubbele underscores – __init__, __str__, __add__, etc. – heten speciale methoden of "dunder" methoden. Ze worden impliciet aangeroepen door Python's runtime en zijn de hook-points voor operator overloading, container-protocollen en meer.

Bijvoorbeeld, de __str__-methode controleert hoe een object geconverteerd wordt naar een menselijk-leesbare string. Standaard toont printen van een object het geheugenadres, wat vaak niet nuttig is. __str__ overschrijven maakt debugging en logging veel duidelijker:

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

Nu, wanneer we een Punt printen, krijgen we:

p1 = Punt(2, 3)
print(p1)

Uitvoer

(2, 3)

Deze representatie wordt ook gebruikt door str(p1) en format(p1) omdat Python intern p1.__str__() aanroept.


De +-operator overladen

Om optelling voor Punt-objecten aan te passen, implementeer __add__:

class Punt:
    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):
        return Punt(self.x + other.x, self.y + other.y)

Testen van het nieuwe gedrag:

p1 = Punt(1, 2)
p2 = Punt(2, 3)
print(p1 + p2)

Uitvoer

(3, 5)

Onder de motorkap voert Python p1.__add__(p2) uit, wat een verse Punt retourneert met de opgetelde coördinaten.

Hieronder een snel overzicht voor andere rekenkundige operatoren en de speciale methoden die je moet implementeren:

OperatorExpressieSpeciale Methode
Optellingp1 + p2__add__(self, other)
Aftrekkingp1 - p2__sub__(self, other)
Vermenigvuldigingp1 * p2__mul__(self, other)
Machtp1 ** p2__pow__(self, other)
Delingp1 / p2__truediv__(self, other)
Gehele delingp1 // p2__floordiv__(self, other)
Modulop1 % p2__mod__(self, other)
Linksshiftp1 << p2__lshift__(self, other)
Rechtsshiftp1 >> p2__rshift__(self, other)
Bitwise ANDp1 & p2__and__(self, other)
Bitwise ORp1 | p2__or__(self, other)
Bitwise XORp1 ^ p2__xor__(self, other)
Bitwise NOT~p1__invert__(self)

Vergelijkingsoperatoren overladen

Operator overloading is niet beperkt tot rekenkunde. Vergelijkingsoperatoren kunnen ook aangepast worden. Bijvoorbeeld, om punten te vergelijken op basis van hun afstand tot de oorsprong, overschrijf __lt__:

class Punt:
    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

Gebruik:

p1 = Punt(1, 1)
p2 = Punt(-2, -3)
p3 = Punt(1, -1)
print(p1 < p2)  # True
print(p2 < p3)  # False
print(p1 < p3)  # False

Andere vergelijkingsmethodes volgen een vergelijkbaar patroon:

OperatorExpressieSpeciale Methode
Kleiner danp1 < p2__lt__(self, other)
Kleiner dan of gelijkp1 <= p2__le__(self, other)
Gelijkp1 == p2__eq__(self, other)
Niet gelijkp1 != p2__ne__(self, other)
Groter danp1 > p2__gt__(self, other)
Groter dan of gelijkp1 >= p2__ge__(self, other)

Door deze methoden zorgvuldig te definiëren, kun je custom objecten natuurlijk laten deelnemen in rekenkundige en vergelijkingscontexten, wat codeleesbaarheid en onderhoudbaarheid verbetert.

Python

  1. Python Datatypes onder de knie krijgen: Een praktische gids
  2. Python Operators onder de knie krijgen: Een uitgebreide gids
  3. Python Pass Statement onder de knie krijgen: Een praktische gids
  4. Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
  5. Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
  6. Python-erfelijkheid beheersen: concepten, syntax en praktische voorbeelden
  7. Python-iterators: hoe ze werken en hoe je je eigen maakt
  8. Python-closures uitgelegd: hoe geneste functies variabelen vangen
  9. Python's @property-decorator beheersen: schone, backward-compatibele getters & setters
  10. Python datetime beheersen: praktische gids voor datums, tijden en tijdzones
  11. Python's time.sleep() onder de knie krijgen: best practices, multithreading en real-world voorbeelden