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'