beiseite, ob die Verwendung von isinstance is harmful Einlochen, ich habe in den folgenden conundrum laufen, wenn isinstance nach Serialisierung/Deserialisierung ein Objekt über Pickle zu bewerten versuchen:Warum bekomme ich unerwartetes Verhalten in Python isinstance nach dem Beizen?
from __future__ import with_statement
import pickle
# Simple class definition
class myclass(object):
def __init__(self, data):
self.data = data
# Create an instance of the class
x = myclass(100)
# Pickle the instance to a file
with open("c:\\pickletest.dat", "wb") as f:
pickle.dump(x, f)
# Replace class with exact same definition
class myclass(object):
def __init__(self, data):
self.data = data
# Read an object from the pickled file
with open("c:\\pickletest.dat", "rb") as f:
x2 = pickle.load(f)
# The class names appear to match
print x.__class__
print x2.__class__
# Uh oh, this fails...(why?)
assert isinstance(x2, x.__class__)
jemand kann etwas Licht auf, warum isinstance in diese scheitern würde Lage? Mit anderen Worten, warum denkt Python, dass diese Objekte aus zwei verschiedenen Klassen bestehen? Wenn ich die zweite Klassendefinition entferne, funktioniert isinstance
gut.
Warum ersetzen Sie die Klasse? Sie erstellen ein neues Objekt mit einem ähnlichen Namen. Aber was ist der Sinn? –
Es ist ein Spielzeugbeispiel. In der Praxis nehme ich an, ich wollte ein Objekt pikeln, über den Draht senden und auf der anderen Seite wieder öffnen. Das empfangende Ende muss eine separate Definition der Klasse haben, was ich hier demonstrieren möchte. –
@Ben Hoffstein: Außer du bist nicht weil es alles in einem Prozess ist. Versuche es in zwei Teile zu zerlegen, um ein realistischeres Beispiel zu geben. –