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'