Đã hỏi 12 năm, 8 tháng trước 12 years, 8 months ago
Đã xem 2,1 triệu lần 2.1m times
2067
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Có một cách đơn giản để xác định xem một biến là một danh sách, từ điển hay cái gì khác?
Mateen Ulhaq
22.3K16 Huy hiệu vàng86 Huy hiệu bạc127 Huy hiệu đồng16 gold badges86 silver badges127 bronze badges
hỏi ngày 8 tháng 2 năm 2010 lúc 21:37Feb 8, 2010 at 21:37
Justin Ethierjustin EthierJustin Ethier
129K51 Huy hiệu vàng226 Huy hiệu bạc281 Huy hiệu Đồng51 gold badges226 silver badges281 bronze badges
13
Có hai chức năng tích hợp giúp bạn xác định loại đối tượng. Bạn có thể sử dụng
>>> isinstance[[], [tuple, list, set]]
True
1 nếu bạn cần loại chính xác của một đối tượng và >>> isinstance[[], [tuple, list, set]]
True
2 để kiểm tra loại đối tượng chống lại một cái gì đó. Thông thường, bạn muốn sử dụng >>> isinstance[[], [tuple, list, set]]
True
2 Hầu hết các lần vì nó rất mạnh mẽ và cũng hỗ trợ kế thừa loại.Để có được loại thực tế của một đối tượng, bạn sử dụng hàm
>>> isinstance[[], [tuple, list, set]]
True
1 tích hợp. Truyền một đối tượng làm tham số duy nhất sẽ trả về đối tượng loại của đối tượng đó:>>> type[[]] is list
True
>>> type[{}] is dict
True
>>> type[''] is str
True
>>> type[0] is int
True
Điều này tất nhiên cũng hoạt động cho các loại tùy chỉnh:
>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
Lưu ý rằng
>>> isinstance[[], [tuple, list, set]]
True
1 sẽ chỉ trả về loại đối tượng ngay lập tức, nhưng won có thể nói với bạn về kế thừa loại.>>> type[b] is Test1
False
Để bao gồm điều đó, bạn nên sử dụng chức năng
>>> isinstance[[], [tuple, list, set]]
True
6. Điều này tất nhiên cũng hoạt động cho các loại tích hợp:>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
>>> isinstance[[], [tuple, list, set]]
True
2 thường là cách ưa thích để đảm bảo loại đối tượng vì nó cũng sẽ chấp nhận các loại dẫn xuất. Vì vậy, trừ khi bạn thực sự cần đối tượng loại [vì bất kỳ lý do gì], sử dụng >>> isinstance[[], [tuple, list, set]]
True
2 được ưa thích hơn >>> isinstance[[], [tuple, list, set]]
True
1.Tham số thứ hai của
>>> isinstance[[], [tuple, list, set]]
True
2 cũng chấp nhận một bộ loại, do đó, nó có thể kiểm tra nhiều loại cùng một lúc. >>> isinstance[[], [tuple, list, set]]
True
6 sau đó sẽ trả về true, nếu đối tượng thuộc bất kỳ loại nào trong số đó:>>> isinstance[[], [tuple, list, set]]
True
Rayryeng
101K21 Huy hiệu vàng181 Huy hiệu bạc185 Huy hiệu đồng21 gold badges181 silver badges185 bronze badges
Đã trả lời ngày 8 tháng 2 năm 2010 lúc 21:40Feb 8, 2010 at 21:40
16
Sử dụng
>>> isinstance[[], [tuple, list, set]]
True
1:>>> a = []
>>> type[a]
>>> f = []
>>> type[f]
Mateen Ulhaq
22.3K16 Huy hiệu vàng86 Huy hiệu bạc127 Huy hiệu đồng16 gold badges86 silver badges127 bronze badges
hỏi ngày 8 tháng 2 năm 2010 lúc 21:37Feb 8, 2010 at 21:39
Justin Ethierjustin Ethierbrettkelly
129K51 Huy hiệu vàng226 Huy hiệu bạc281 Huy hiệu Đồng8 gold badges53 silver badges70 bronze badges
0
Có hai chức năng tích hợp giúp bạn xác định loại đối tượng. Bạn có thể sử dụng
>>> isinstance[[], [tuple, list, set]]
True
1 nếu bạn cần loại chính xác của một đối tượng và >>> isinstance[[], [tuple, list, set]]
True
2 để kiểm tra loại đối tượng chống lại một cái gì đó. Thông thường, bạn muốn sử dụng >>> isinstance[[], [tuple, list, set]]
True
2 Hầu hết các lần vì nó rất mạnh mẽ và cũng hỗ trợ kế thừa loại.Để có được loại thực tế của một đối tượng, bạn sử dụng hàm
>>> isinstance[[], [tuple, list, set]]
True
1 tích hợp. Truyền một đối tượng làm tham số duy nhất sẽ trả về đối tượng loại của đối tượng đó:Điều này tất nhiên cũng hoạt động cho các loại tùy chỉnh:
Lưu ý rằng
>>> isinstance[[], [tuple, list, set]]
True
1 sẽ chỉ trả về loại đối tượng ngay lập tức, nhưng won có thể nói với bạn về kế thừa loại.Feb 8, 2010 at 21:43
Để bao gồm điều đó, bạn nên sử dụng chức năng
>>> isinstance[[], [tuple, list, set]]
True
6. Điều này tất nhiên cũng hoạt động cho các loại tích hợp:Seth Johnson
2 thường là cách ưa thích để đảm bảo loại đối tượng vì nó cũng sẽ chấp nhận các loại dẫn xuất. Vì vậy, trừ khi bạn thực sự cần đối tượng loại [vì bất kỳ lý do gì], sử dụng >>> isinstance[[], [tuple, list, set]]
True
2 được ưa thích hơn >>> isinstance[[], [tuple, list, set]]
True
1.6 gold badges57 silver badges85 bronze badges>>> isinstance[[], [tuple, list, set]]
True
2
Tham số thứ hai của
>>> isinstance[[], [tuple, list, set]]
True
2 cũng chấp nhận một bộ loại, do đó, nó có thể kiểm tra nhiều loại cùng một lúc. >>> isinstance[[], [tuple, list, set]]
True
6 sau đó sẽ trả về true, nếu đối tượng thuộc bất kỳ loại nào trong số đó:__class__
Rayryeng
>>> str = "str"
>>> str.__class__
>>> i = 2
>>> i.__class__
>>> class Test[]:
... pass
...
>>> a = Test[]
>>> a.__class__
101K21 Huy hiệu vàng181 Huy hiệu bạc185 Huy hiệu đồng
Đã trả lời ngày 8 tháng 2 năm 2010 lúc 21:40Jun 26, 2013 at 21:38
2
Sử dụng >>> isinstance[[], [tuple, list, set]]
True
1:
>>> isinstance[[], [tuple, list, set]]
True
Đã trả lời ngày 8 tháng 2 năm 2010 lúc 21:39
>>> obj = object[]
>>> type[obj]
Brettkellybrettkelly
>>> obj.__class__ # avoid this!
27.1k8 Huy hiệu vàng53 Huy hiệu bạc70 Huy hiệu đồng
Có thể sử dụng khối ________ 53 ...________ 54. Bằng cách đó, nếu bạn có một lớp mà các trò chơi như một danh sách, hoặc những kẻ lừa đảo như một dict, nó sẽ hoạt động đúng bất kể loại của nó thực sự là gì.
Để làm rõ, phương pháp "nói sự khác biệt" giữa các loại biến là với một thứ gọi là gõ vịt: miễn là các phương pháp [và loại trả về] mà một biến đáp ứng là những gì chương trình con của bạn mong đợi, hãy coi nó như những gì bạn mong đợi được. Ví dụ: nếu bạn có một lớp làm quá tải các toán tử khung với
>>> a = []
>>> type[a]
>>> f = []
>>> type[f]
5 và >>> a = []
>>> type[a]
>>> f = []
>>> type[f]
6, nhưng sử dụng một số sơ đồ nội bộ hài hước, nó sẽ phù hợp để nó hoạt động như một từ điển nếu đó là những gì nó đang cố gắng mô phỏng.>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
0Vấn đề khác với việc kiểm tra
>>> a = []
>>> type[a]
>>> f = []
>>> type[f]
7 là nếu >>> a = []
>>> type[a]
>>> f = []
>>> type[f]
8 là một lớp con của >>> a = []
>>> type[a]
>>> f = []
>>> type[f]
9, nó sẽ đánh giá thành __class__
0 khi, theo chương trình, bạn sẽ hy vọng nó sẽ là __class__
1. Nếu một đối tượng là một lớp con của một danh sách, nó sẽ hoạt động như một danh sách: kiểm tra loại như được trình bày trong câu trả lời khác sẽ ngăn chặn điều này. [>>> isinstance[[], [tuple, list, set]]
True
6 sẽ hoạt động, tuy nhiên].Đã trả lời ngày 8 tháng 2 năm 2010 lúc 21:43
Seth Johnsonseth Johnson
>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
114.3k6 Huy hiệu vàng57 Huy hiệu bạc85 Huy hiệu Đồng
Trên các trường hợp của đối tượng, bạn cũng có:
>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
2Sự kết luận
- Sử dụng
3 để thực sự có được lớp học.__class__
- Sử dụng
6 để kiểm tra rõ ràng các lớp con thực tế hoặc trừu tượng đã đăng ký.>>> isinstance[[], [tuple, list, set]] True
- Và chỉ cần tránh kiểm tra loại nơi nó có ý nghĩa.
Đã trả lời ngày 14 tháng 3 năm 2017 lúc 21:12Mar 14, 2017 at 21:12
3
Bạn có thể sử dụng
>>> isinstance[[], [tuple, list, set]]
True
1 hoặc >>> isinstance[[], [tuple, list, set]]
True
2.>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
3Được cảnh báo rằng bạn có thể clobber
>>> str = "str"
>>> str.__class__
>>> i = 2
>>> i.__class__
>>> class Test[]:
... pass
...
>>> a = Test[]
>>> a.__class__
4 hoặc bất kỳ loại nào khác bằng cách gán một biến trong phạm vi hiện tại của cùng tên.>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
4Ở trên, chúng ta thấy rằng
>>> str = "str"
>>> str.__class__
>>> i = 2
>>> i.__class__
>>> class Test[]:
... pass
...
>>> a = Test[]
>>> a.__class__
5 được chỉ định lại vào một chuỗi, do đó, bài kiểm tra:>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
5...fails.
Để giải quyết vấn đề này và sử dụng
>>> isinstance[[], [tuple, list, set]]
True
1 một cách thận trọng hơn:>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
6Đã trả lời ngày 31 tháng 5 năm 2014 lúc 21:57May 31, 2014 at 21:57
deed02392deed02392deed02392
4.6582 Huy hiệu vàng29 Huy hiệu bạc48 Huy hiệu đồng2 gold badges29 silver badges48 bronze badges
3
Hãy cẩn thận bằng cách sử dụng isinstance
>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
7Nhưng loại
>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
8Đã trả lời ngày 14 tháng 11 năm 2017 lúc 11:22Nov 14, 2017 at 11:22
1
Mặc dù các câu hỏi khá cũ, tôi tình cờ tìm thấy điều này trong khi tìm hiểu một cách thích hợp và tôi nghĩ nó vẫn cần làm rõ, ít nhất là đối với Python 2.x [không kiểm tra Python 3, nhưng vì vấn đề phát sinh với các lớp học cổ điển Điều này đã được thực hiện trên phiên bản như vậy, nó có thể không quan trọng].at least for Python 2.x [did not check on Python 3, but since the issue arises with classic classes which are gone on such version, it probably doesn't matter].
Ở đây tôi đang cố gắng trả lời câu hỏi của tiêu đề: Làm thế nào tôi có thể xác định loại đối tượng tùy ý? Các đề xuất khác về việc sử dụng hoặc không sử dụng isinstance là tốt trong nhiều bình luận và câu trả lời, nhưng tôi không giải quyết những lo ngại đó.how can I determine the type of an arbitrary object? Other suggestions about using or not using isinstance are fine in many comments and answers, but I'm not addressing those concerns.
Vấn đề chính với phương pháp
>>> isinstance[[], [tuple, list, set]]
True
1 là nó không hoạt động đúng với các trường hợp kiểu cũ:it doesn't work properly with old-style instances:>>> class Test1 [object]:
pass
>>> class Test2 [Test1]:
pass
>>> a = Test1[]
>>> b = Test2[]
>>> type[a] is Test1
True
>>> type[b] is Test2
True
9Thực hiện đoạn trích này sẽ mang lại:
>>> type[b] is Test1
False
0Mà, tôi lập luận, không phải là điều mà hầu hết mọi người mong đợi.
Cách tiếp cận
__class__
4 là gần với tính đúng đắn nhất, nhưng nó sẽ không hoạt động trong một trường hợp quan trọng: khi đối tượng truyền qua là một lớp kiểu cũ [không phải là một ví dụ!], Vì các đối tượng đó thiếu thuộc tính như vậy.Đây là đoạn mã nhỏ nhất mà tôi có thể nghĩ về điều đó thỏa mãn câu hỏi hợp pháp như vậy một cách nhất quán:
>>> type[b] is Test1
False
1Đã trả lời ngày 17 tháng 6 năm 2016 lúc 8:35Jun 17, 2016 at 8:35
Alan Franzonialan FranzoniAlan Franzoni
2.9611 Huy hiệu vàng22 Huy hiệu bạc32 Huy hiệu đồng1 gold badge22 silver badges32 bronze badges
Bên cạnh các câu trả lời trước đó, đáng để đề cập đến sự tồn tại của
>>> str = "str"
>>> str.__class__
>>> i = 2
>>> i.__class__
>>> class Test[]:
... pass
...
>>> a = Test[]
>>> a.__class__
9 có chứa một số lớp cơ sở trừu tượng [ABC] bổ sung cho việc gõ vịt.Ví dụ: thay vì kiểm tra rõ ràng nếu một cái gì đó là một danh sách với:
>>> type[b] is Test1
False
2Bạn có thể, nếu bạn chỉ quan tâm đến việc xem đối tượng bạn có cho phép nhận được các mục, hãy sử dụng
>>> obj = object[]
>>> type[obj]
0:>>> type[b] is Test1
False
3Nếu bạn hoàn toàn quan tâm đến các đối tượng cho phép nhận, cài đặt và xóa các mục [tức là các chuỗi có thể thay đổi], bạn sẽ chọn cho
>>> obj = object[]
>>> type[obj]
1.Nhiều ABC khác được xác định ở đó,
>>> obj = object[]
>>> type[obj]
2 cho các đối tượng có thể được sử dụng dưới dạng bản đồ, >>> obj = object[]
>>> type[obj]
3, >>> obj = object[]
>>> type[obj]
4, et cetera. Một danh sách đầy đủ của tất cả những điều này có thể được nhìn thấy trong tài liệu cho >>> str = "str"
>>> str.__class__
>>> i = 2
>>> i.__class__
>>> class Test[]:
... pass
...
>>> a = Test[]
>>> a.__class__
9.Đã trả lời ngày 7 tháng 12 năm 2016 lúc 15:50Dec 7, 2016 at 15:50
Trong nhiều trường hợp thực tế thay vì sử dụng
__class__
3 hoặc >>> isinstance[[], [tuple, list, set]]
True
6, bạn cũng có thể sử dụng >>> obj = object[]
>>> type[obj]
8, được sử dụng để xác định các hàm chung [chức năng bao gồm nhiều chức năng thực hiện cùng một hoạt động cho các loại khác nhau].Nói cách khác, bạn sẽ muốn sử dụng nó khi bạn có mã như sau:
>>> type[b] is Test1
False
4Đây là một ví dụ nhỏ về cách nó hoạt động:
>>> type[b] is Test1
False
5>>> type[b] is Test1
False
6Ngoài ra, chúng tôi có thể sử dụng các lớp trừu tượng để bao gồm nhiều loại cùng một lúc:
>>> type[b] is Test1
False
7>>> type[b] is Test1
False
8Đã trả lời ngày 17 tháng 6 năm 2019 lúc 15:34Jun 17, 2019 at 15:34
GEORGYGEORGYGeorgy
10,9k7 Huy hiệu vàng62 Huy hiệu bạc68 Huy hiệu Đồng7 gold badges62 silver badges68 bronze badges
>>> type[b] is Test1
False
9Hoặc bạn có thể làm một cái gì đó như thế này
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
0Đã trả lời ngày 7 tháng 4 năm 2021 lúc 15:49Apr 7, 2021 at 15:49
Yash Marmatyash MarmatYash Marmat
9658 Huy hiệu bạc16 Huy hiệu đồng8 silver badges16 bronze badges
sử dụng loại []
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
1đầu ra
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
2Chỉ trích xuất chỉ sử dụng điều này
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
3đầu ra
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
4Chỉ trích xuất chỉ sử dụng điều này
Nếu bạn sử dụng
>>> obj = object[]
>>> type[obj]
9, nó có thể được chúng tôi đọcNov 5, 2021 at 16:34
Đã trả lời ngày 5 tháng 11 năm 2021 lúc 16:34vkv
VKVVKV11 bronze badges
34411 huy hiệu đồng
>>> isinstance[[], [tuple, list, set]]
True
1 là một giải pháp tốt hơn >>> isinstance[[], [tuple, list, set]]
True
2, đặc biệt là đối với >>> obj.__class__ # avoid this!
2:>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
5>>> obj.__class__ # avoid this!
3 và >>> obj.__class__ # avoid this!
4 chỉ là các từ khóa có nghĩa là >>> obj.__class__ # avoid this!
5 và >>> obj.__class__ # avoid this!
6 trong Python. Như vậy,>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
6và
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
7Cả hai trở lại
>>> obj.__class__ # avoid this!
3. Cả hai booleans là một ví dụ của một số nguyên. >>> isinstance[[], [tuple, list, set]]
True
1, tuy nhiên, thông minh hơn:Trả về
>>> obj.__class__ # avoid this!
4.May 25, 2019 at 3:26
Đã trả lời ngày 25 tháng 5 năm 2019 lúc 3:26Alec
Alecalec7 gold badges30 silver badges57 bronze badges
7.5487 Huy hiệu vàng30 Huy hiệu bạc57 Huy hiệu Đồng
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
8Nói chung, bạn có thể trích xuất một chuỗi từ đối tượng với tên lớp,
>>> isinstance[b, Test1]
True
>>> isinstance[b, Test2]
True
>>> isinstance[a, Test1]
True
>>> isinstance[a, Test2]
False
>>> isinstance[[], list]
True
>>> isinstance[{}, dict]
True
9và sử dụng nó để so sánh,Jun 17, 2019 at 9:50
Đã trả lời ngày 17 tháng 6 năm 2019 lúc 9:50will not work for type checking of a subtype that is not an instance. While that makes perfect sense, none of the answers [including the accepted one] covers it. Use issubclass for that.
>>> isinstance[[], [tuple, list, set]]
True
0Để hoàn thiện, isinstance sẽ không hoạt động để kiểm tra kiểu con không phải là một ví dụ. Trong khi điều đó có ý nghĩa hoàn hảo, không có câu trả lời nào [bao gồm cả câu trả lời được chấp nhận] bao gồm nó. Sử dụng class ISSUBCLASS cho điều đó.Jul 2, 2020 at 10:45
Đã trả lời ngày 2 tháng 7 năm 2020 lúc 10:45Adnan Y
Adnan Yadnan y1 gold badge23 silver badges28 bronze badges