2012-03-09 39 views
6

Đó là sự hiểu biết của tôi rằng kể từ khi hợp nhất loại/lớp mỗi giá trị là loại có nguồn gốc từ object. Tuy nhiên tôi không thể tìm thấy xác nhận tuyệt đối về điều này trong tài liệu. Trong khi nó đứng lên lý do mà isinstance(anything, object) luôn luôn là True, tôi cũng có thể tưởng tượng có trường hợp cạnh kế thừa trong codebase Python 2. Có ai biết ví dụ về số điện thoại isinstance(value, object)khôngTrue?Có giá trị nào trong Python mà isinstance (giá trị, đối tượng) không đúng không?

Bối cảnh: như một phần của phân cấp loại Tôi đang thiết kế, có một loại tất cả-encompasing Alpha mà tôi muốn isinstance(obj, Alpha) để luôn trả lại True. Tôi nghĩ rằng trên Python 2.6+ ABCMeta.register(object) nên làm các trick, nhưng tôi muốn chắc chắn.

CHỈNH SỬA: Vì mục đích của hậu thế, ABCMeta.register(object) sẽ không hoạt động (hãy thử). Ethan Furman cung cấp một giải pháp thay thế cho trường hợp này trong câu trả lời dưới đây.

+0

Mọi thứ đều là một thể hiện của 'đối tượng'. Có sự khó khăn ở cấp độ C để làm cho thậm chí 'kiểu (đối tượng)' một thể hiện của đối tượng. Tôi không có một tài liệu tham khảo ngay bây giờ nhưng có một bài đăng blog ra có đôi khi trong sáu tháng qua về việc này. – agf

Trả lời

1

Có thể tạo các lớp bằng mã không phải Python (ví dụ: C) không lấy được từ object.

Bạn sẽ có thể đạt được những gì bạn muốn bằng cách thêm __subclasshook__ để bạn Alpha:

--> import abc 
--> class Test(object): 
... __metaclass__ = abc.ABCMeta 
... @classmethod 
... def __subclasshook__(cls, C): 
...  return True 
... 
--> isinstance(dict(), Test) 
True 
--> isinstance(42, Test) 
True 
--> isinstance(0.59, Test) 
True 
--> class old_style: 
...  pass 
... 
--> isinstance(old_style(), Test) 
True 
+0

Hrm .. nhưng bất kỳ loại trăn tinh khiết nào sẽ luôn xuất phát từ đối tượng? Điều đó có thể đủ tốt, miễn là nó cũng đúng với các mô-đun thư viện C thường được sử dụng/chuẩn (cStringIO, cDecimal, v.v.) – maaku

+0

Trừ khi chúng vẫn đang sử dụng các lớp kiểu cũ - nhưng nếu sự khác biệt đó không quan trọng là '__subclasshook__ của bạn 'có thể bỏ qua nó (như ví dụ). –

+0

Tuyệt vời! Nó trông giống như giải pháp lý tưởng cho 'Alpha'. Cảm ơn Ethan! – maaku

0

Trong 2.x, lớp người dùng định nghĩa (và một vài lớp stdlib) không xuất phát từ đối tượng bằng cách mặc định . Điều này được sửa trong 3.x.

+0

Mayby đó là những gì maaku có nghĩa là "từ loại/lớp thống nhất"? – WolframH

+0

@WolframH: mỗi * chữ * là một thể hiện của đối tượng. Nó vẫn còn (trong 2.x) có thể tạo các lớp mà các cá thể của nó không phải là các cá thể của đối tượng. –

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