Khi xem qua tài liệu và cụ thể ở đây http://docs.python.org/2/reference/expressions.html#is, tôi vẫn không thể tìm thấy phương thức dunder/protocol xác định việc triển khai từ khóa Python is
. Phương pháp nào xác định nó? Từ những gì tôi hiểu, tất cả is
là so sánh kết quả của hàm id
khi được gọi trên hai đối tượng.Phương pháp dunder Python cho `is`
Trả lời
Không có phương pháp dunder cho is
. Bạn không thể ghi đè nó, và đó là cố ý. Toàn bộ điểm của is
là nó cho bạn biết liệu hai biểu thức có tham chiếu cùng một giá trị hay không. Vì vậy, nó phải là sai, theo định nghĩa, cho hai giá trị khác nhau. Vì vậy, không cần phải ghi đè lên nó.
Như the docs đặt nó:
Các nhà khai thác
is
vànot is
thử nghiệm cho nhận dạng đối tượng:x is y
là đúng nếu và chỉ nếu x và y là cùng một đối tượng.
(Có nhiều hơn một chút trong Data model docs.)
Ngoài ra, is
không so sánh kết quả của id
.
id
chỉ được xác định để trả về "một số nguyên được đảm bảo là duy nhất và không đổi cho đối tượng này trong suốt thời gian tồn tại". Có nghĩa là is
chắc chắn có thể sử dụng id
, nhưng tôi không biết bất kỳ triển khai nào thực hiện.
Điều đó đang được nói, trong CPython, nó có hiệu quả giống như vậy trong các nắp - is
kiểm tra các con trỏ bằng nhau, trong khi id
đưa con trỏ vào một số nguyên và trả về nó. Vì vậy, sự khác biệt duy nhất giữa việc thực hiện nó trực tiếp so với việc thực hiện nó thông qua id
sẽ là một cặp cuộc gọi chức năng bổ sung và một dàn diễn dịch không có mã máy…
Nhưng trong các triển khai khác, điều đó có thể không đúng. (Mà nên được rõ ràng, khi bạn xem xét rằng Jython và PyPy được viết bằng ngôn ngữ mà thậm chí không có một điều như một con trỏ.) Ví dụ, trong PyPy, is
kiểm tra rằng các đối tượng RPython cơ bản là như nhau, trong khi id
trả về một khóa được tạo khi đang di chuyển (và được lưu trong bộ nhớ cache nếu sau đó bạn gọi id
trên cùng một giá trị).
Chờ đợi, do đó, không có thực hiện python tinh khiết cho 'is', tất cả của nó trong C? –
@EdgarAroutiounian: Tất cả trong C trong CPython. Tất nhiên là trong Java, .NET, hoặc RPython trong các triển khai Python khác. – abarnert
Bất kể việc triển khai thực hiện, 'id (a) == id (b)' * phải * trả lại kết quả tương tự như 'a là b' ... bạn có đồng ý không? – nmclean
- 1. Python - TypeError: phương pháp unbound
- 2. phương pháp chính trong Python
- 3. Python phương pháp dải
- 4. Python Phương pháp tĩnh, tại sao?
- 5. Phương pháp vuông tối thiểu trong python
- 6. phương pháp nhập khẩu cho một lớp Python
- 7. là có putAll như phương pháp cho dict trong python?
- 8. python Idiomatic - tài sản hoặc phương pháp?
- 9. Toán tử `is` có sử dụng phương thức __magic__ trong Python không?
- 10. Tìm hiểu toán tử "is" của Python
- 11. Toán tử 'is' làm gì trong Python?
- 12. Emacs: phương pháp gỡ lỗi python
- 13. Emacs: phương pháp gỡ lỗi python
- 14. Biên dịch AST python sang phương pháp
- 15. Python phương pháp tĩnh - làm thế nào để gọi một phương thức từ phương pháp khác
- 16. Lớp Python và phương pháp __init__
- 17. Private biến và phương pháp trong Python
- 18. Trang trí và phương pháp python
- 19. Python: gói phương pháp invocations với trước và sau phương pháp
- 20. Phương pháp Python để đọc nhấn phím?
- 21. phương pháp __contains__ Overriding cho một lớp
- 22. Phương pháp mở rộng bằng Python
- 23. Bản đồ phương pháp trong python
- 24. Cách đánh cắp phương pháp python
- 25. Chú thích phương pháp khóa python
- 26. phương pháp quá tải trong python
- 27. Trọng một phương pháp tĩnh trong python
- 28. override phương pháp "private" bằng Python
- 29. phương pháp khác cho before_validation
- 30. Is collections.defaultdict thread-safe?
Bạn nói đúng; và 'id' trả về vị trí bộ nhớ của đối tượng. Vì vậy, trừ khi bạn muốn đặt đối tượng của bạn ở một số vị trí cụ thể trong RAM, bạn sẽ không bao giờ cần phải viết thực hiện 'is' của riêng bạn. Nếu bạn muốn kiểm tra sự tương đương của hai đối tượng, hãy sử dụng '__eq__' thay vì – inspectorG4dget
@ inspectorG4dget Xin cảm ơn! –
Tôi vừa học được ý nghĩa của [dunder] (http://wiki.python.org/moin/DunderAlias)! –