2013-07-25 13 views
9

Nel modulo threading, nomi come RLock, Semaphore e Event sono tutte funzioni di fabbrica, mentre il nome delle classi di implementazione è preceduto da trattini di sottolineatura.Perché le classi nel modulo di threading Python espongono le funzioni di fabbrica anziché i costruttori?

Le funzioni di fabbrica passano solo tutti gli argomenti che hanno ricevuto ai costruttori sottostanti.

Quindi qual è il vantaggio di farlo?

+2

La mia ipotesi è legacy; il modulo è piuttosto vecchio –

+0

@MartijnPieters È così? Sto ancora usando Python2.7 sulla mia macchina. – satoru

+0

'threading' è stato aggiunto alla libreria nel 1998; Penso che la versione 1.5.1 di Python sia stata la prima ad includerla. –

risposta

2

Non c'è alcun vantaggio reale.

Guido added the module 1998; la prima revisione include già quelle funzioni di fabbrica. Forse aveva piani per quelle funzioni di fabbrica, forse stava guardando l'implementazione di Java e copiato su alcuni idiomi, forse voleva rendere le cose collegabili con una ri-implementazione C nella parte posteriore della sua testa.

Possiamo solo indovinare o chiedere a Guido direttamente.

3

Gli archivi di thread-sig sembrano essere scomparsi da Internet (*), ma sono abbastanza sicuro che ti impedisce di sottoclassi di cose che non sono progettate per essere suddivise in sottoclassi (davvero non vuoi interrompere la sincronizzazione primitive per errore), e il modulo è abbastanza vecchio da non poterlo fare con un inganno di classe nuovo stile quando è stato aggiunto.

Si noti inoltre che, ad es. RLock ha più classi di implementazione.

*) Bene, ho trovato alcuni resti su un server FTP in Grecia, ma questo non aveva le specifiche originali.

+0

Da quando Python (e la sua libreria) tenta di impedire alle persone di fare cose strane? – glglgl

+0

Da sempre? È un software, dopotutto, quindi "prevenire" significa "renderlo un po 'più difficile", non "renderlo impossibile". Un modo ovvio per farlo, ecc. – Fredrik

+0

Ok, ma ciononostante è un comportamento normale per Python. Ad esempio, non ci sono attributi di classe privati ​​o protetti, perché un programmatore "adulto" non ne ha bisogno. (Almeno, lo dicono.) Quindi è non logico e non consecutivo per impedire di ereditare da 'RLock'. YMMV. – glglgl

Problemi correlati