Creazione di attributi dinamici Python, una benedizione o una maledizione?

6

Considera questo codice:

>>> class Foo():
        pass
...
>>> foo = Foo()
>>> foo.a = 'test'
>>> foo.a
'test'

Si può semplicemente sovrascrivere __setattr__ per rendere gli attributi di sola lettura e impedire la loro creazione in fase di runtime, tuttavia:

  • Perché questo è il comportamento di default di Python (qualche buona ragione)?
  • Esiste qualche pratica per impedirlo senza alterare ogni classe?
  • Ti preoccuperesti di questo comportamento nei progetti seri? non lo consideri incline agli errori? oppure puoi semplicemente ignorarlo (basandosi sul completamento del codice IDE nuovo)
posta 01walid 31.08.2013 - 14:35
fonte

2 risposte

8

Come altri già menzionati, prevenire ciò richiederebbe un caso speciale per __init__ , e uno dei principi di progettazione di Python è di evitare casi speciali, vedi Zen di Python :

Special cases aren't special enough to break the rules.

Questo design è anche in linea con altre decisioni di progettazione, ad esempio la mancanza di controlli di tipo statico o modificatori del controllo di accesso. Python tende a potenziare i suoi utenti, non a rinforzare le cose.

Puoi facilmente prevenirlo per qualsiasi classe specifica usando __slots__ . Tuttavia, non c'è modo di cambiare questo globalmente .

Sebbene ciò possa in teoria causare errori, non mi preoccuperei molto di ciò. Ad esempio, un errore di battitura potrebbe significare che si è per caso creato un nuovo attributo quando si intendeva assegnare a un attributo esistente. Tuttavia, una buona copertura dei test unitari di solito la cattura.

    
risposta data 01.09.2013 - 14:32
fonte
2

Would you worry about this behavior in serious projects? don't you consider it error prone? or you can just ignore it (relying on new IDEs code completion)

Sì, mi preoccupo. Per me, non è chiaro dal post se si sta puntando ai pericoli di permettere agli estranei di ragionare e modificare la struttura degli oggetti, o ai pericoli di assegnare a un attributo precedentemente non definito. Tuttavia, entrambi i comportamenti sono noti per essere problematici (il primo, per sacrificare i vantaggi che le tecniche di nascondere le informazioni portano in tavola e fare affidamento sulla convenzione, il secondo per consentire la diffusione delle definizioni di struttura / oggetto quando si desidera organizzarli localmente ).

    
risposta data 31.08.2013 - 20:58
fonte

Leggi altre domande sui tag