Xác định loại đối tượng Python
Xác định loại đối tượng với type
>>> obj = object()
>>> type(obj)
<class 'object'>
Mặc dù nó hoạt động, tránh hai thuộc tính gạch dưới như __class__
- chúng không công khai về mặt ngữ nghĩa và trong khi có lẽ không phải trong trường hợp này, các hàm dựng sẵn thường có hành vi tốt hơn.
>>> obj.__class__ # avoid this!
<class 'object'>
kiểm tra loại
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, hoặc cái gì khác không? Tôi đang nhận được một đối tượng có thể là một trong hai loại và tôi cần có thể nói sự khác biệt.
Đó là một câu hỏi khác, không sử dụng loại - sử dụng isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Điều này bao gồm trường hợp người dùng của bạn có thể làm điều gì đó thông minh hoặc hợp lý bằng cách phân lớp str
- theo nguyên tắc Thay thế Liskov, bạn muốn có thể sử dụng các thể hiện của lớp con mà không vi phạm mã của mình - và isinstance
hỗ trợ điều này.
Sử dụng trừu tượng
Thậm chí tốt hơn, bạn có thể tìm kiếm một Lớp cơ sở trừu tượng cụ thể từ collections
hoặc numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
Hoặc chỉ cần đừng kiểm tra loại rõ ràng
Hoặc, có lẽ tốt nhất trong tất cả, sử dụng gõ vịt và không kiểm tra rõ ràng mã của bạn. Gõ vịt hỗ trợ thay thế Liskov với sự thanh lịch hơn và ít chi tiết hơn.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Phần kết luận
- Sử dụng
type
để thực sự có được một lớp của một cá thể.
- Sử dụng
isinstance
để kiểm tra rõ ràng các lớp con thực tế hoặc trừu tượng đã đăng ký.
- Và chỉ cần tránh kiểm tra loại nơi nó có ý nghĩa.