Đó 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ề loại của nó. Trong trường hợp này, bạn phải so sánh hai loại trường hợp.
Nếu bạn cần kiểm tra ưu tiên, sẽ tốt hơn nếu bạn kiểm tra giao diện được hỗ trợ so với loại.
Loại 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 có 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 của một loại hoàn toàn khác sẽ hoàn toàn tốt vì nó 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 đang giảm khả năng tái sử dụng của thói quen 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 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 trong việc làm điều đó: tham số [0] sẽ tăng một ngoại lệ nếu giao thức không được thỏa mãn ... tất nhiên điều này trừ khi bạn muốn ngăn chặn các tác dụng phụ hoặc phải phục hồi sau các cuộc gọi mà bạn có thể gọi trước khi thất bại. [Ngu ngốc] Ví dụ, chỉ để đưa ra quan điểm:
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 một ngoại lệ trước khi chạy cuộc gọi hệ thống []. Nếu không kiểm tra giao diện, bạn sẽ xóa tệp, và sau đó nêu ra ngoại lệ.
& nbsp;
Hàm isinstance
là trang được trang bị tốt nhất để xử lý kiểm tra loại vì nó hỗ trợ kế thừa [ví dụ: một thể hiện của lớp dẫn xuất cũng là một thể hiện của một lớp cơ sở]. Do đó, isinstance
nên được sử dụng bất cứ khi nào cần so sánh loại.
Chống lại mẫu
Câu lệnh
def firstElement[parameter]:
return parameter[0]
0 bên dưới sử dụng mẫu def firstElement[parameter]:
return parameter[0]
1 để so sánh đối tượng def firstElement[parameter]:
return parameter[0]
2 với loại tích hợp [def firstElement[parameter]:
return parameter[0]
3 trong ví dụ này]. Đây không phải là mẫu ưa thích để so sánh các loại.import types class Rectangle[object]: def __init__[self, width, height]: self.width = width self.height = height r = Rectangle[3, 4] # bad if type[r] is types.ListType: print["object r is a list"]
Lưu ý rằng tình huống sau sẽ không làm tăng lỗi, mặc dù nó nên.
import types class Rectangle[object]: def __init__[self, width, height]: self.width = width self.height = height class Circle[object]: def __init__[self, radius]: self.radius = radius c = Circle[2] r = Rectangle[3, 4] # bad if type[r] is not type[c]: print["object types do not match"]
Thực hành tốt nhất¶
Sử dụng isinstance
để so sánh các loại
Mẫu ưa thích để so sánh các loại là chức năng tích hợp isinstance
.
import types class Rectangle[object]: def __init__[self, width, height]: self.width = width self.height = height r = Rectangle[3, 4] # good if isinstance[r, types.ListType]: print["object r is a list"]