Warum geben Sie(classInstance) ist wieder in 'Instanz'?
Habe ich eine Methode, die einen parameter akzeptiert, der kann von verschiedenen Arten, und hat eine Sache zu machen oder andere, je nach Typ, aber wenn ich den Typ überprüfen, sagte der parameter, die ich nicht bekommen, der "echte" Typ, ich bekomme immer <type 'instance'>
, und das ist messing mit meinem Vergleiche.
Ich habe so etwas wie:
from classes import Class1
from classes import Class2
# Both classes are declared in the same file.
# I don't know if that can be a problem #
# ... #
def foo(parameter)
if (type(parameter) == type(Class1()):
# ... #
elif (type(parameter) == type(Class2()):
# ... #
Und als type(parameter)
zurück <type 'instance'>
und type(Class1())
ist <type 'instance'>
als gut, es stellt sich heraus, dass selbst, wenn der parameter ist eine Instanz von Class2, es geht in den ersten Vergleich...
Übrigens str(parameter.__class__)
richtig zeigt classes.Class1
. Ich glaube, ich könnte immer verwenden, aber ich würde gerne verstehen, was Los ist... habe ich gemacht Zehntel Vergleiche wie dieser, und alle von Ihnen funktionierte einwandfrei...
Danke!!!! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Old-style-Klassen tun. Leiten Sie die Klassen aus
object
in Ihren Definitionen.type()
berührt.sollten Sie wirklich verwenden isinstance:
Typ ist besser für built-in Typen.
isinstance
ist sicherlich in der Regel zu bevorzugen direktetype()
Prüfung und bestimmt die form der Typprüfung, die Sie verwenden, wo Sie tatsächlich instanziierenClass1()
für jede Prüfung ist unerwünscht. Was Sie aber, dass Artikel sagt, ist, dass in vielen Fällen die Prüfung für die Arten überhaupt (je nachdem, welche Methode Sie verwenden für das) ist ein Zeichen von schlechtem Programmierstil. IMO ist der Artikel unhelpfully religiöse und es gibt noch gültig verwendet für Typ-überprüfung, aber wenn Sie das tun, 'Zehner', der prüft, gegen Ihre eigenen benutzerdefinierten Typen, die klingt wie eine potentielle "nicht-Objekt-orientierte genug" code-smell.if isinstace( obj, Cls)
sollte in einer Methode, die von Cls. Es klingt vielleicht religiös, aber wenn Sie verwenden möchten OOP (nicht, dass Sie haben), dann muss man zumindest Recht.Die Tatsache, dass
type(x)
wieder die gleichen type-Objekt für alle Instanzenx
legacy, auch bekannt als old-style Klassen, ist eine von vielen ärgerlich Mängel, die von dieser Art von Klassen -- leider Sie haben zu bleiben (und der Standardwert für a-Klasse ohne sockel) in Python2.*
aus Gründen der rückwärts-Kompatibilität.Trotzdem nicht verwenden, old-style-Klassen, es sei denn, Sie sind gezwungen, halten ein Bündel von alten legacy-code (ohne eine gute test-suite, um Ihnen das Vertrauen, um zu versuchen und Schalter Art a-Klassen). Wenn eine Klasse hat keine "natürlichen" Basen, Unterklasse es aus
object
anstatt aus dem nichts. Alternativ können Sie Ihr Modul, an der Spitze, könnenwelche änderungen der Standard von der crufty, legacy old-style-Klassen, um die glänzende helle neue Stil, - und zwar explizit Erben von
object
ist in der Regel bevorzugt ("explizit ist besser als implizit"), die Modul-Globale Einstellung der__metaclass__
fühlen sich vielleicht "weniger invasiv", um vorhandene alte Module, wo man das Umschalten vom alten auf den neuen Klassen, so bietet es sich als eine Möglichkeit.object
vs nicht Erben und eine Modul-Globale__metaclass__=type
ist genau das gleiche - sehr unterschiedliche Stile, ununterscheidbar Ergebnisse.