No, in realtà è schiacciante comune non per verificare i valori di tipo, come nel tuo secondo approccio. L'idea è che un client del tuo codice (ad esempio un altro programmatore che utilizza la tua classe) debba essere in grado di passare qualsiasi tipo di oggetto che abbia tutti i metodi o le proprietà appropriati. Se non si tratta di un'istanza di qualche particolare classe, va bene; il tuo codice non ha mai bisogno di sapere la differenza. Questo è chiamato anatra digitando, a causa del motto "Se cova come un'anatra e vola come un'anatra, potrebbe anche essere un'anatra" (beh, questo non è il vero adagio ma ho capito il senso di ciò penso)
Un luogo che si vede molto è nella libreria standard, con qualsiasi funzione che gestisca l'input o l'output del file. Invece di richiedere un oggetto effettivo file
, prenderanno tutto ciò che implementa il metodo read()
o readline()
(a seconda della funzione) o write()
per la scrittura. In effetti lo vedrai spesso nella documentazione, ad es. con tokenize.generate_tokens
, che mi è capitato di essere alla ricerca di prima di oggi:
Il generatore generate_tokens()
richiede un solo argomento, readline, che deve essere un oggetto richiamabile che fornisce la stessa interfaccia come il metodo di readline()
built-in oggetti file (vedere la sezione File Objects). Ogni chiamata alla funzione dovrebbe restituire una riga di input come una stringa.
Questo consente di utilizzare un oggetto StringIO
(come un file in memoria), o qualcosa di simile wackier una finestra di dialogo, al posto di un file reale.
Nel proprio codice, è sufficiente accedere a qualsiasi proprietà di un oggetto di cui si ha bisogno e, se si tratta del tipo di oggetto errato, una delle proprietà necessarie non sarà presente e genererà un'eccezione.
fonte
2010-07-25 00:13:32
Secondo. Vedi anche [EAFP] (http://docs.python.org/glossary.html#term-eafp): È più facile chiedere perdono che autorizzazione. –
questo è molto interessante. Dopotutto, dovremmo goderci le caratteristiche dei pitoni invece di difenderci da loro. –