Mi chiedo se ci siano schemi, riferimenti o risorse utili su come implementare oggetti che possono avere diverse rappresentazioni equivalenti. Ad esempio:
Supponiamo che io voglia implementare un Rectangle
, e lo istanziamo usando length
e width
:
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
e supponiamo che ora io abbia anche la possibilità di istanziare Rectangle
usando diagonal
e area
. La mia preoccupazione principale è che non voglio memorizzare informazioni ridondanti nell'oggetto (in questo caso, queste quattro proprietà), solo il minimo possibile per definirlo.
Supponiamo anche che potrei voler recuperare un set di proprietà avendo creato Rectangle
usando un altro:
r = Rectangle(length=3, width=4)
assert r.diagonal == 5
Questo è quello che ho provato finora:
class Rectangle:
def __init__(self, **kwargs):
params = set(kwargs.keys())
if params == set(['length', 'width']):
self._length = kwargs['length']
self._width = kwargs['width']
elif params == set(['area', 'diagonal']):
self._area = kwargs['area']
self._diagonal = kwargs['diagonal']
else:
raise ValueError('Invalid input arguments')
@property
def length(self):
if hasattr(self, '_length'):
return self._length
elif hasattr(self, '_area') and hasattr(self, '_diagonal'):
length, width = ad2lw(self._area, self._diagonal)
#r = Rectangle(length=length, width=width)
#return r._length
return length
else:
raise NotImplementedError('No converter available')
# Same with other three properties
def ad2lw(area, diagonal):
# Obscure math
return l, w
Si tratta di uno schema noto o esiste un modo standard per farlo?