Có cách nào để kiểm tra xem hai đối tượng có cùng giá trị không, ngoài việc lặp qua các thuộc tính của chúng và so sánh các giá trị của chúng theo cách thủ công?So sánh hai đối tượng
Trả lời
giải pháp @Joe Kington của hoạt động nếu có một __dict__
(một số đối tượng, trong đó có lệnh nội trú, không có một) và __eq__
công trình cho tất cả các giá trị của cả hai dicts (một nặng bằng văn bản __eq__
ngoại lệ mayraise vv). Nhưng nó là khủng khiếp unpythonic. Nó thậm chí không xử lý các loại phụ danh nghĩa đúng ... các kiểu con cấu trúc ít hơn nhiều (tức là các kiểu mà bạn có thể sử dụng tại chỗ/cho việc gõ vịt). Không làm điều này.
Nhưng thường thì bạn nên sử dụng phương pháp __eq__
được điều chỉnh thủ công chỉ so sánh một số thuộc tính quan trọng. Ví dụ. Hợp lý chỉ nên so sánh tử số và mẫu số, không gì hơn.
"một số so sánh vô nghĩa có thể tăng ngoại lệ": không, điều này chỉ áp dụng cho các so sánh liên quan đến việc đặt hàng - kiểm tra nếu 'a' bằng' b' (tức là 'a == b', được biểu thị hoặc ngụ ý) ** không bao giờ ** ngoại lệ (trừ khi bạn cố tình mã một lớp lạ ghi đè '__eq__' cho mục đích duy nhất là gây ra các ngoại lệ như vậy ;-). IOW, so sánh về bình đẳng/bất bình đẳng là ** không bao giờ ** "vô nghĩa". –
@Alex Hoặc trừ khi ai đó mã hóa một lớp như vậy. Các lớp học được viết kém sẽ xảy ra khá thường xuyên. Tuy nhiên, delnan dường như ngụ ý rằng một số loại nội trang đã xử lý theo cách này, điều này thực sự không chính xác. –
Có, nội trang không làm điều này. Xin lỗi nếu nó đọc như thế. – delnan
object1.__dict__ == object2.__dict__
nên được tất cả các bạn cần, tôi nghĩ ...
Edit: vars(object1) == vars(object2)
có lẽ là pythonic hơn một chút, mặc dù @delnan làm cho một điểm hợp lệ về các đối tượng (ví dụ int
s) mà không có một __dict__
. Tôi không đồng ý rằng một tùy chỉnh __eq__
là một cách tiếp cận tốt hơn cho các trường hợp đơn giản, mặc dù ... Đôi khi nó không có giá trị nỗ lực để đi xa nhanh chóng và bẩn, nếu nhanh chóng và bẩn hoàn toàn làm những gì bạn cần, i.m.h.o.
Chạm vào '__dict__' trực tiếp về cơ bản là luôn luôn sai. – habnabit
@Aaron, tôi đồng ý rằng việc sửa đổi '__dict__' trực tiếp về cơ bản luôn sai ... Tôi không đồng ý rằng đọc nó trực tiếp về cơ bản là luôn luôn sai. Có lẽ 'vars' là một chút rõ ràng hơn, mặc dù ... –
không, đọc nó về cơ bản luôn luôn là sai là tốt. Nó bỏ qua giao thức mô tả, chưa kể nó dựa trên một chi tiết thực hiện. – habnabit
Để nói thêm về câu trả lời của delnan:
_NOTFOUND = object()
class Rational(object):
def __eq__(self, other):
for attr in ['numerator', 'denominator']:
v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]]
if v1 is _NOTFOUND or v2 is _NOTFOUND:
return False
elif v1 != v2:
return False
return True
Bạn có thể so sánh namedtuple trực tiếp.
Nếu không, bạn phải xác định một trong hai so sánh của riêng bạn giàu __eq__
và có thể __ne__
hoặc riêng __cmp__
bạn thấy datamodel để biết thêm
- 1. So sánh hai đối tượng.
- 2. java so sánh hai đối tượng Mẫu
- 3. jQuery so sánh hai đối tượng DOM?
- 4. So sánh hai đối tượng NSNumber
- 5. Django so sánh giá trị của hai đối tượng
- 6. So sánh hai đối tượng DateTime Thời gian Joda
- 7. So sánh Integer đối tượng
- 8. So sánh hai loại
- 9. C# Loại đối tượng So sánh
- 10. So sánh đối tượng dữ liệu chính
- 11. So sánh đối tượng thanh lịch
- 12. đối tượng So sánh trong ruby
- 13. So sánh Integer đối tượng vs int
- 14. Core: NSPredicate so sánh đối tượng
- 15. So sánh đối tượng ngày JavaScript
- 16. So sánh hai đối tượng null từ hai loại khác nhau
- 17. So sánh hai băm?
- 18. So sánh hai UIImages
- 19. So sánh hai mảng
- 20. postgres - so sánh hai mảng
- 21. Java So sánh Hai Lists
- 22. So sánh đối tượng javascript mẹ đẻ với jQuery
- 23. Cách hiệu quả để so sánh các đối tượng StringBuilder
- 24. So sánh hai điển trong C#
- 25. So sánh các mảng đối tượng, cách tối ưu
- 26. So sánh hai số NSStrings
- 27. java So sánh hai ngày
- 28. Hãy so sánh hai ArrayList
- 29. NSDate, so sánh hai ngày
- 30. Cách so sánh hai ngày?
Xem [câu hỏi này tương tự] (http://stackoverflow.com/ câu hỏi/390250/thanh lịch-cách-to-hỗ trợ-tương đương-bình đẳng-in-python-lớp học) – GreenMatt