2012-03-09 8 views
6

È a mia conoscenza che dal momento che l'unificazione di tipo/classe ogni valore è di un tipo che deriva da object. Tuttavia non riesco a trovare una conferma assoluta di ciò nei documenti. Mentre è ovvio che isinstance(anything, object) dovrebbe essere sempre True, potrei anche immaginare che ci siano casi di legacy edge nella base di Python 2. Qualcuno sa di un esempio in cui isinstance(value, object) è nonTrue?Esiste qualche valore in Python per il quale isinstance (valore, oggetto) non è True?

Contesto: come parte di una gerarchia di tipo sto progettando, c'è un all-encompasing Alpha tipo per cui voglio isinstance(obj, Alpha) per tornare sempre True. Sto pensando che su Python 2.6+ ABCMeta.register(object) dovrebbe fare il trucco, ma voglio essere sicuro.

EDIT: Per i posteri, ABCMeta.register(object) non funzionerà (provarlo). Ethan Furman fornisce una soluzione alternativa per questo caso nella sua risposta qui sotto.

+0

Tutto è un'istanza di 'oggetto'. C'è un inganno a livello C per rendere anche 'type (object)' un'istanza di oggetto. Non ho un riferimento in questo momento ma c'era un post sul blog negli ultimi sei mesi a riguardo. – agf

risposta

1

È possibile creare classi in codice non Python (C, ad esempio) che non derivano da object.

Si dovrebbe essere in grado di ottenere quello che vuoi con l'aggiunta di __subclasshook__ al vostro Alpha:

--> import abc 
--> class Test(object): 
... __metaclass__ = abc.ABCMeta 
... @classmethod 
... def __subclasshook__(cls, C): 
...  return True 
... 
--> isinstance(dict(), Test) 
True 
--> isinstance(42, Test) 
True 
--> isinstance(0.59, Test) 
True 
--> class old_style: 
...  pass 
... 
--> isinstance(old_style(), Test) 
True 
+0

Hrm .. ma qualsiasi tipo di puro pitone deriva sempre dall'oggetto? Questo potrebbe essere abbastanza buono, purché sia ​​vero anche per i moduli di libreria C comunemente usati/standard (cStringIO, cDecimal, ecc.) – maaku

+0

A meno che non stiano ancora utilizzando le classi di stile precedenti - ma se tale distinzione non è importante il tuo '__subclasshook__ 'può ignorarlo (come fa l'esempio). –

+0

Fantastico! Sembra la soluzione ideale per 'Alpha'. Grazie, Ethan! – maaku

0

In 2.x, le classi definite dall'utente (e un paio di classi stdlib) non derivino da oggetto di default . Questo problema è stato risolto in 3.x.

+0

Mayby è ciò che intendeva Maaku "dal tipo/unificazione di classe"? – WolframH

+0

@WolframH: ogni * letterale * è un'istanza di oggetto. È ancora (in 2.x) possibile creare classi le cui istanze non sono istanze di oggetto. –