Ecco una semplice esplorazione delle due funzioni. L'ho trovato illuminante durante questo esercizio. Spesso mi creerò un semplice programma di esplorare gli angoli più riposti di funzioni semplici e salvarli per riferimento:
#
# Testing isinstance and issubclass
#
class C1(object):
def __init__(self):
object.__init__(self)
class B1(object):
def __init__(self):
object.__init__(self)
class B2(B1):
def __init__(self):
B1.__init__(self)
class CB1(C1,B1):
def __init__(self):
# not sure about this for multiple inheritance
C1.__init__(self)
B1.__init__(self)
c1 = C1()
b1 = B1()
cb1 = CB1()
def checkInstanceType(c, t):
if isinstance(c, t):
print c, "is of type", t
else:
print c, "is NOT of type", t
def checkSubclassType(c, t):
if issubclass(c, t):
print c, "is a subclass of type", t
else:
print c, "is NOT a subclass of type", t
print "comparing isinstance and issubclass"
print ""
# checking isinstance
print "checking isinstance"
# can check instance against type
checkInstanceType(c1, C1)
checkInstanceType(c1, B1)
checkInstanceType(c1, object)
# can check type against type
checkInstanceType(C1, object)
checkInstanceType(B1, object)
# cannot check instance against instance
try:
checkInstanceType(c1, b1)
except Exception, e:
print "failed to check instance against instance", e
print ""
# checking issubclass
print "checking issubclass"
# cannot check instance against type
try:
checkSubclassType(c1, C1)
except Exception, e:
print "failed to check instance against type", e
# can check type against type
checkSubclassType(C1, C1)
checkSubclassType(B1, C1)
checkSubclassType(CB1, C1)
checkSubclassType(CB1, B1)
# cannot check type against instance
try:
checkSubclassType(C1, c1)
except Exception, e:
print "failed to check type against instance", e
Edit: Considera anche quanto segue come isinstance può rompere implementazioni API. Un esempio potrebbe essere un oggetto che si comporta come un dizionario, ma non è derivato da dict. isinstance potrebbe verificare che un oggetto è un dizionario, anche se l'oggetto supporta dizionario accesso stile: isinstance considered harmful
Edit2:
Qualcuno può per favore mi dia un esempio di una distinzione tra il superamento di un tipo come un secondo argomento contro il superamento di un oggetto?
Dopo aver testato il codice precedente, il secondo parametro deve essere un tipo. Quindi nel seguente caso:
checkInstanceType(c1, b1)
La chiamata avrà esito negativo. Potrebbe essere scritto:
checkInstanceType(c1, type(b1))
Quindi, se si desidera controllare il tipo di un'istanza contro un altro esempio è necessario utilizzare il tipo() chiamata incorporato.
Questo dovrebbe dare qualche prospettiva: http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#object-type-example – karthikr
@karthikr D'accordo, grande articolo – jamylak
Oppure dare un'occhiata a questa domanda http: //stackoverflow.com/questions/100003/what-is-a-metaclass-in-python?rq=1 e la grande risposta, mentre riguarda le metaclassi, specifica i tipi e gli oggetti per costruire la descrizione di un metaclass - davvero buono leggere. –