Se stai usando Python 3.4 o più recente, hai accesso a functools.singledispatch
(grazie a PEP 443 ), che ti consente di sovraccaricare le funzioni (preferibilmente unario) come te sarebbe in una lingua come Java.
Se definisci i tuoi vari poliedri come classi, puoi inviare i loro tipi, in questo modo:
import math
from functools import singledispatch
class Cube:
def __init__(self, x):
self.x = x
class Cuboid:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
class Cylinder:
def __init__(self, *, r, h):
self.r = r
self.h = h
# Mark this function as single-dispatchable.
@singledispatch
def volume(polyhedron):
pass # Or throw an exception, or something like that.
def _volume_cube(cube):
return cube.x ** 3
def _volume_cuboid(cuboid):
return cuboid.x * cuboid.y * cuboid.z
def _volume_cylinder(cylinder):
return math.pi * (cylinder.r) ** 2 * cylinder.h
# Register handlers for the types for which you can compute volumes.
volume.register(Cube, _volume_cube)
volume.register(Cuboid, _volume_cuboid)
volume.register(Cylinder, _volume_cylinder)
Ora puoi fare questo:
>>> cube = Cube(4)
>>> volume(cube)
64
>>> cuboid = Cuboid(3, 5, 7)
>>> volume(cuboid)
105
>>> cylinder = Cylinder(r=2, h=4)
>>> volume(cylinder)
50.26548245743669
Se stai utilizzando una versione precedente alla 3.4, non hai davvero delle buone opzioni per questo tipo di singolo invio trasparente (anche se potresti sempre backport functools.singledispatch
se sei su un precedente 3.x - è scritto in Python puro e non credo che faccia affidamento su nessuna nuova funzionalità 3.4). Potresti, invece, avere una funzione volume(cube=None, cuboid=None, cylinder=None)
, o volume(polyhedron)
e invio su type(polyhedron)
all'interno della funzione, o fare un po 'di magia con **kwargs
.
Tutto ciò che ho detto, in qualche modo dubito che il tuo libro voglia usare functools.singledispatch
- rischierei di indovinare che qualcuno ha appena copiato i problemi da un C ++ o da un libro Java senza pensarci davvero.