Implementazione di oggetti con diverse rappresentazioni equivalenti

1

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?

    
posta astrojuanlu 06.04.2014 - 21:51
fonte

1 risposta

3

L'idea generale è che hai definito l'oggetto in un modo, ad es. usando larghezza e lunghezza e puoi calcolare altri parametri, es. diagonale e area da loro.

Prima il tuo costruttore / init accetta solo lunghezza e larghezza, ma la classe potrebbe anche avere il metodo createFromDiagonal statico, che accetta la diagonale e l'area, calcola la larghezza e la lunghezza, crea l'istanza usando quei parametri e restituisce questa istanza.

La seconda cosa è accedere ai valori. Puoi facilmente accedere a lunghezza e larghezza, perché quelle sono ciò che definisce l'oggetto. E per diagonale e area puoi usare Proprietà , che calcolerà il valore richiesto da lunghezza e larghezza mentre l'accesso dall'esterno sarà simile al campo normale.

    
risposta data 06.04.2014 - 22:17
fonte

Leggi altre domande sui tag