Đó là bởi vì bạn phải viết
s="hello"
type(s) == type("")
loại chấp nhận một thể hiện và trả về kiểu của nó. Trong trường hợp này, bạn phải so sánh hai loại của các cá thể.
Nếu bạn cần thực hiện kiểm tra ưu tiên, bạn nên kiểm tra giao diện được hỗ trợ hơn loại đó.
Loại này không thực sự cho bạn biết nhiều, ngoài thực tế là mã của bạn muốn một thể hiện của một loại cụ thể, bất kể thực tế là bạn có thể có một thể hiện khác loại hoàn toàn khác thực hiện cùng một giao diện.
Ví dụ, giả sử bạn có mã này
def firstElement(parameter):
return parameter[0]
Bây giờ, giả sử bạn nói: Tôi muốn mã này chỉ chấp nhận một tuple.
import types
def firstElement(parameter):
if type(parameter) != types.TupleType:
raise TypeError("function accepts only a tuple")
return parameter[0]
Điều này làm giảm khả năng sử dụng lại quy trình này. Nó sẽ không hoạt động nếu bạn vượt qua một danh sách, hoặc một chuỗi, hoặc một numpy.array.Một cái gì đó tốt hơn sẽ là
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
return parameter[0]
nhưng không có điểm nào khi thực hiện nó: tham số [0] sẽ ngoại trừ trường hợp bạn không hài lòng ... tất nhiên trừ khi bạn muốn ngăn chặn tác dụng phụ hoặc phải phục hồi từ các cuộc gọi mà bạn có thể gọi trước khi không thành công. Ví dụ (ngu ngốc), chỉ để làm cho vấn đề:
def firstElement(parameter):
if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
raise TypeError("interface violation")
os.system("rm file")
return parameter[0]
trong trường hợp này, mã của bạn sẽ tăng ngoại lệ trước khi chạy cuộc gọi system(). Nếu không có kiểm tra giao diện, bạn có thể đã xóa tệp và sau đó đưa ra ngoại lệ.
Tôi muốn bạn (OP) nên * chắc chắn * đọc liên kết được tham chiếu, cung cấp nhiều chi tiết về lý do kiểm tra loại đối tượng thường là ý tưởng tồi, và những gì bạn có thể nên làm thay vào đó. –
từ bộ nhớ đang phục hồi (obj, basestring) sẽ lấy chuỗi unicode quá ... –
bạn nên sử dụng basestr, không str. nếu không bạn sẽ không chọn unicode. (mặc dù cho 3.x tôi nghĩ str * là * basestr) – hasen