2011-01-29 33 views
19

Trong trường hợp nào có thể xảy ra, và khi nào là không thể, để gán cho thuộc tính __class__ của một cá thể trong Python?Gán thuộc tính __class__ của một cá thể trong Python

Thông báo lỗi như TypeError: __class__ assignment: only for heap types không thực sự làm điều đó cho tôi.

+6

@ Rafe: thực sự, Django sử dụng thủ thuật này trong mã xác thực –

+2

vào cuối bữa tiệc, nhưng matplotlib thực hiện điều này trong mã sản xuất (trong một số âm mưu 3D). – tacaswell

Trả lời

13

Bạn chỉ có thể gán cho thuộc tính __class__ của một phiên bản của lớp do người dùng xác định (nghĩa là sử dụng từ khóa class) và giá trị mới cũng phải là lớp do người dùng xác định. Các lớp học có phong cách mới hay kiểu cũ không quan trọng. (Bạn không thể kết hợp chúng. Tuy nhiên, bạn không thể biến một thể hiện kiểu cũ thành một thể hiện kiểu mới.) Xem thêm this issue trong trình theo dõi lỗi Python, cũng phàn nàn rằng thông báo lỗi có phần khó hiểu không.

Chỉ cần thêm những gì Rafe đã nói trong nhận xét trên: Không bao giờ thực hiện việc này trong sản xuất.

+3

Ngoài ra, từ thử nghiệm của tôi có vẻ như sự hiện diện/vắng mặt của '__slots__' cũng tạo sự khác biệt:" X deallocator khác với Y "từ' instance_with_slots .__ class__ = ClassWithoutSlots' và 'instance_without_slots .__ class__ = ClassWithSlots' – delnan

+1

Ah, tôi đã bối rối vì đã làm 'a .__ class__ = B .__ class__' khi tôi rõ ràng nên làm' a .__ class__ = B' – porgarmingduod

+1

Xem http://www.mail-archive.com/[email protected]/msg52950. html cho một danh sách các sự khác biệt giữa các loại có thể gây ra rắc rối – jimifiki

Các vấn đề liên quan