Bỏ qua dù việc sử dụng các isinstance is harmful, tôi đã chạy vào câu hỏi hóc búa sau khi cố gắng đánh giá isinstance sau serializing/deserializing một đối tượng thông qua Pickle:Tại sao tôi nhận được hành vi không mong muốn trong Python đang phục hồi sau khi tẩy?
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__)
bất cứ ai có thể làm sáng tỏ về lý do tại sao isinstance sẽ thất bại trong này tình hình? Nói cách khác, tại sao Python nghĩ rằng các đối tượng này là hai lớp khác nhau? Khi tôi xóa định nghĩa lớp thứ hai, isinstance
hoạt động tốt.
Tại sao bạn thay thế lớp học? Bạn đang tạo một đối tượng mới có tên tương tự. Nhưng vấn đề là gì? –
Đó là một ví dụ về đồ chơi. Trong thực tế, giả sử tôi muốn chọn một vật, gửi nó qua dây và tháo nó ra phía bên kia. Đầu nhận sẽ cần phải có một định nghĩa riêng biệt của lớp, đó là những gì tôi đang cố gắng để chứng minh ở đây. –
@Ben Hoffstein: Ngoại trừ bạn không phải vì đó là tất cả trong một quá trình. Hãy thử chia nó thành hai để tạo ra một ví dụ thực tế hơn. –