ws hat geschrieben:[...]
Wenn man das ausführt, sieht man, dass alle o.a. Objekte als Instanzen von object aufgefasst werden, das gilt also auch für builtin-Typen. Ich will aber eigentlich gerade wissen, ob eine Variable eine Instanz irgendeines User-defined-Typs ist. instanceof könnte ich nur überprüfen, ob obj Instanz eines bestimmten Typen ist.
Ja weil du auch ``isinstance(foo, object)`` schreibst.
Wenn du die Klasse ``Foo`` und ``Bar`` hast , die beiden von dem obersten Objekt in der Hierarchie ``object`` abgeleitet sind, dann wird es für Instanzen von ``Foo`` und ``Bar`` immer ein ``True`` zurückliefern, wenn du ein ``isinstance`` auf ``object`` anwendest. Was du möchtest ist eigentlich zu testen ob die Instanz eine Instanz von ``Foo``, ``Bar``, etc ist.
Hier mal ein Beispiel zur Verdeutlichung:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Foo(object):
pass
class Bar(object):
pass
foo = Foo()
bar = Bar()
print "Ist ``foo`` eine Instanz von ``Foo``?: %s" % isinstance(foo, Foo)
print "Ist ``foo`` eine Instanz von ``Bar``?: %s" % isinstance(foo, Bar)
print "Ist ``foo`` eine Instanz von ``object``?: %s" % isinstance(foo, object)
print
print "Ist ``bar`` eine Instanz von ``Foo``?: %s" % isinstance(bar, Foo)
print "Ist ``bar`` eine Instanz von ``Bar``?: %s" % isinstance(bar, Bar)
print "Ist ``bar`` eine Instanz von ``object``?: %s" % isinstance(bar, object)
Analog dazu gilt das oben angesprochene für ``object``, auch für eine Ableitung von Foo:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Foo(object):
pass
class SpecialFoo(Foo):
pass
foo = SpecialFoo()
print "Ist ``foo`` eine Instanz von ``Foo``?: %s" % isinstance(foo, Foo)
print "Ist ``foo`` eine Instanz von ``SpecialFoo``?: %s" % isinstance(foo, SpecialFoo)
print "Ist ``foo`` eine Instanz von ``object``?: %s" % isinstance(foo, object)
Ist auch logisch so, da ``SpecialFoo` als Base ``foo`` hat, und es ein ``isinstance``, wie bei testen auf ``object``, mitberücksichtigt.
In deinem Beispiel müsstest du allso ``isinstance(td, TestDict)`` schreiben, um herauszubekommen ob ``td`` eine Instanz von ``TestDict`` ist.