Nope, trên thực tế đó là áp đảo chung không để kiểm tra giá trị loại, như trong cách tiếp cận thứ hai của bạn. Ý tưởng là một khách hàng của mã của bạn (tức là một số lập trình viên khác sử dụng lớp của bạn) sẽ có thể truyền bất kỳ loại đối tượng nào có tất cả các phương thức hoặc thuộc tính thích hợp. Nếu nó không xảy ra là một ví dụ của một số lớp học cụ thể, đó là tốt; mã của bạn không bao giờ cần phải biết sự khác biệt. Điều này được gọi là gõ vịt, vì câu ngạn ngữ "Nếu nó giống như vịt và ruồi như vịt, nó cũng có thể là một con vịt" (tốt, đó không phải là câu ngạn ngữ thực sự nhưng tôi có ý chính của nó)
Một nơi bạn sẽ thấy điều này rất nhiều trong thư viện chuẩn, với bất kỳ chức năng nào xử lý đầu vào hoặc đầu ra của tệp. Thay vì yêu cầu đối tượng thực tế file
, họ sẽ thực hiện bất kỳ điều gì thực hiện phương thức read()
hoặc readline()
(tùy thuộc vào chức năng) hoặc write()
để viết. Trên thực tế, bạn thường thấy điều này trong tài liệu, ví dụ: với tokenize.generate_tokens
, mà tôi chỉ tình cờ được xem xét trước ngày hôm nay:
Các máy phát điện generate_tokens()
đòi hỏi một đối số, readline, mà phải là một đối tượng có thể được gọi mà cung cấp giao diện tương tự như phương pháp readline()
được xây dựng trong đối tượng tệp (xem phần File Objects). Mỗi cuộc gọi đến hàm sẽ trả về một dòng đầu vào dưới dạng một chuỗi.
Điều này cho phép bạn sử dụng đối tượng StringIO
(như tệp trong bộ nhớ) hoặc thứ gì đó khác thường như hộp thoại thay cho tệp thực.
Trong mã của riêng bạn, chỉ cần truy cập bất kỳ thuộc tính nào của đối tượng bạn cần và nếu đó là loại đối tượng không đúng, một trong các thuộc tính bạn cần sẽ không ở đó và nó sẽ ném một ngoại lệ.
Nguồn
2010-07-25 00:13:32
Thứ hai. Ngoài ra, hãy xem [EAFP] (http://docs.python.org/glossary.html#term-eafp): Dễ hỏi hơn sự tha thứ so với giấy phép. –
điều này rất thú vị. Sau khi tất cả, chúng ta nên thưởng thức các tính năng pythons thay vì bảo vệ chúng. –