Estrarre il tipo di una proprietà

5

In Python per la maggior parte delle volte non è necessario scrivere getter e setter per ottenere l'accesso alle proprietà della classe. Detto questo, a volte devi ricordare che una certa proprietà è una lista o qualcosa del genere e una proprietà ti salverebbero lì estraendo il tipo e fornendo un setter per aggiungere qualcosa a tale elenco, ad esempio piuttosto che esporre direttamente la lista.

Dove traccia la linea tra l'esposizione diretta del tipo o il suo accesso in una proprietà? Qual è il generale consiglio "pythonic"?

    
posta Lorenzo 09.08.2012 - 15:22
fonte

2 risposte

3

Ho avuto una lotta interna con il codice "Pythonic" rispetto al codice "ben architettato" (beh, almeno in senso accademico) per un po '. Più tempo trascorro scrivendo codice Python in modo professionale (e diletto in OSS), più mi rendo conto che essere "Pythonic" a volte butta via tutto ciò che hai imparato su "corretto" OOP.

Niente in Python è veramente privato. In quanto tale, non c'è motivo di avere getter e setter. Sì, puoi usare decoratori ( @property , ecc.), Ma ho trovato poco utile per loro oltre a gonfiare il mio codice (e sono molto usati raramente in qualsiasi codice che io ' ve guardato attraverso).

Per quanto riguarda il controllo dei tipi, mi baso sull'utente del codice per essere abbastanza intelligente da sapere cosa stanno facendo. Se usano un tipo errato, da qualche parte lungo la linea verrà presentato un errore di runtime che dovrebbe essere abbastanza facile da eseguire il debug con pdb (o ovvio con il messaggio di errore). Di nuovo, codice gonfia.

Detto questo, se c'è qualcosa che il codice client dovrebbe essere reso noto al runtime (contenuto basato sui dati, ecc.), userò assert , che può essere disabilitato in un ambiente non di debug con Python -O flag .

Il "miglior" codice Python può essere facilmente bannato. Meno codice scrivi (o più cancella), più è facile capire il tuo codice. Come una spina senza vergogna per una libreria che ho scritto, ho implementato un client OAuth 2.0 che funziona su tutti i flussi lato server e supporta più provider immediatamente disponibili in 66 LOC . Rispetto ad una delle prime revisioni a ~ 450 LOC, è abbastanza facile da capire;)

Dopotutto Siamo tutti adulti consenzienti .

    
risposta data 29.08.2012 - 21:49
fonte
0

Evita di esporre i membri della classe al mondo esterno. Utilizza invece getter / setter.

Il tipo di membro effettivo è sconosciuto al di fuori della classe e puoi avere diversi setter che impostano lo stesso membro. Ogni setter può ricevere parametri diversi ed effettuare la conversione.

Non conosco Phyton ma posso darti un esempio in pseudocodice:

public class MyClass {
    private String a;

    private List<String> l = new ArrayList<String>();

    public void setA(String newValue){
        this.a = newValue;
    }

    public void setA(int newValue){
        this.a = ""+newValue;  // convert to string
    }

    public void addL(String newValue){
        l.add(newValue);
    }
}

Quindi puoi farlo con un'istanza di quella classe:

object.setA(1);
object.setA("xx");
object.addL("yy");
    
risposta data 29.08.2012 - 21:34
fonte

Leggi altre domande sui tag