Prekrivanje operatorjev

Obstaja več načinov, kako prekriti obnašanje operatorja za množenje *: lahko definiramo metodo z imenom __mul__, ali metodo z imenom __rmul__, ali obe.

Če je levi operand množenja objekt tipa Tocka, potem Python pokliče metodo __mul__, ki predvideva, da je tudi drugi operand tipa Tocka. Metoda izračuna skalarni produkt (ang. dot product) dveh objetov Tocka, ki je definiran skladno s pravili linearne algebre:

Class Tocka:
  # ...

  def __mul__(self, tocka):
    return self._x * tocka._x + self._y * tocka._y

Če je levi operand množenja število (oziroma osnovni številski tip) in desni operand objekt tipa Tocka, potem Python pokliče metodo __rmul__, ki izračuna produkt s skalarjem (ang. scalar multiplication):

Class Tocka:
  # ...

  def __rmul__(self, vrednost):
    return Tocka(vrednost * self._x,  vrednost * self._y)

Rezultat tega množenja je nov objekt Tocka, katerega koordinati sta večkratnika izvornih koordinat. Če množenje ni mogoče, potem metoda __rmul__ javi napako.

Spodnji primer prikazuje uporabo obeh vrst množenja:

>>> t1 = Tocka(4, 3)
>>> t2 = Tocka(5, 7)
>>> print(t1 * t2)
41
>>> print(2 * t2)
(10, 14)


Kaj bi se zgodilo, če bi želeli pomnožiti t2 * 2? Ker je prvi parameter vrste Tocka, bi Python poklical metodo __mul__ s številom 2 kot drugim parametrom. Znotraj metode __mul__ bi program skušal dostopati do lastnosti _x spremenljivke tocka, kar ne bi uspelo, saj število nima lastnosti _x:

>>> print(t2 * 2)
AttributeError: 'int' object has no attribute '_x'

Izvedi Počisti