Phương pháp so sánh lớp Python

Thật dễ dàng để so sánh các đối tượng có sẵn trong Python, như 1 < 2, 'abc' < 'abd', tuple (0, 1, 3) < tuple (0, 2, 1). Nhưng làm thế nào để so sánh các đối tượng của riêng bạn? . (Tôi đang sử dụng Python 3. 6. 5)

class Point:
def __init__(self, x, y):
self.x = x
self.y = y

Python sẽ phàn nàn về

TypeError: '<' not supported between instances of 'Point' and 'Point'
8 vì nó không biết cách so sánh

TypeError: '<' not supported between instances of 'Point' and 'Point'

Dưới đây là 3 giải pháp để so sánh và sắp xếp các đối tượng này

Giải pháp 1. Sử dụng tham số khóa sort()

Giả sử chúng ta muốn so sánh các điểm theo khoảng cách của chúng với

TypeError: '<' not supported between instances of 'Point' and 'Point'
9

class Point:
def __init__(self, x, y):
self.x = x
self.y = y

def __repr__(self):
# display x and y instead of address
return f'Point(x={self.x}, y={self.y})'
points = [Point(0, 1), Point(3, 0), Point(1, 0), Point(2, 0)]
points.sort(key=lambda p: p.x * p.x + p.y * p.y)
print(points)

Kết quả in ra là một danh sách đã sắp xếp

[Point(x=0, y=1), Point(x=1, y=0), Point(x=2, y=0), Point(x=3, y=0)]

Cả

class Point:
def __init__(self, x, y):
self.x = x
self.y = y

def __repr__(self):
# display x and y instead of address
return f'Point(x={self.x}, y={self.y})'
points = [Point(0, 1), Point(3, 0), Point(1, 0), Point(2, 0)]
points.sort(key=lambda p: p.x * p.x + p.y * p.y)
print(points)
0 (tại chỗ) và
TypeError: '<' not supported between instances of 'Point' and 'Point'
0 (tạo danh sách mới) đều hỗ trợ chức năng lambda. Tham số
TypeError: '<' not supported between instances of 'Point' and 'Point'
1 cũng rất hữu ích

Giải pháp 2. Ghi đè phương pháp dunder

Chúng ta có thể xác định cách so sánh với một đối tượng khác bằng cách ghi đè thao tác

TypeError: '<' not supported between instances of 'Point' and 'Point'
2 và một trong các thao tác
TypeError: '<' not supported between instances of 'Point' and 'Point'
3,
TypeError: '<' not supported between instances of 'Point' and 'Point'
4,
TypeError: '<' not supported between instances of 'Point' and 'Point'
5,
TypeError: '<' not supported between instances of 'Point' and 'Point'
6. Dunder là viết tắt của dấu gạch dưới kép

TypeError: '<' not supported between instances of 'Point' and 'Point'
1

Chúng ta có thể nhận được cùng một danh sách được sắp xếp

Giải pháp 3. Chuyển đổi thành các đối tượng tích hợp

Sử dụng bộ dữ liệu

TypeError: '<' not supported between instances of 'Point' and 'Point'
7 và Python biết cách so sánh bộ dữ liệu và số nguyên (khoảng cách_square).
TypeError: '<' not supported between instances of 'Point' and 'Point'
8 là cần thiết để giữ vị trí tương đối của hai điểm có cùng khoảng cách, i. e. làm cho việc phân loại ổn định

TypeError: '<' not supported between instances of 'Point' and 'Point'
4

Kết quả là một danh sách các bộ dữ liệu được sắp xếp và có thể bạn cần một dòng khác để trích xuất các điểm đó

TypeError: '<' not supported between instances of 'Point' and 'Point'
5Kết luận

Mã của Giải pháp 1 là mã ít nhất và ít mã hơn có nghĩa là ít lỗi hơn. Giải pháp 2 là giải pháp linh hoạt nhất vì quy tắc so sánh nằm trong lớp. Với Giải pháp 2, chúng tôi có thể kiểm tra

TypeError: '<' not supported between instances of 'Point' and 'Point'
9. Giải pháp 3 chiếm thêm dung lượng, nhưng nó rất hữu ích vì một mục thông thường là một bộ
class Point:
def __init__(self, x, y):
self.x = x
self.y = y

def __repr__(self):
# display x and y instead of address
return f'Point(x={self.x}, y={self.y})'
points = [Point(0, 1), Point(3, 0), Point(1, 0), Point(2, 0)]
points.sort(key=lambda p: p.x * p.x + p.y * p.y)
print(points)
0

Làm cách nào để so sánh hai phương thức trong Python?

Tóm tắt. - Để so sánh hai đối tượng, chúng ta cần thực hiện các toán tử __comparison__ tích hợp sẵn . - Nếu chúng ta triển khai các phương thức < và

Phương pháp __ EQ __ là gì?

Python có toán tử “==”, toán tử “is” và “__eq__” phương thức dunder để so sánh hai đối tượng của một lớp hoặc để tùy chỉnh phép so sánh.

6 toán tử so sánh trong Python là gì?

Kết thúc ngày hôm nay, chúng ta đã học được sáu toán tử so sánh trong python. Đây là- python nhỏ hơn, python lớn hơn, Nhỏ hơn hoặc Bằng, Bằng hoặc lớn hơn, Python Bằng và Toán tử không bằng Python .

Python có so sánh các loại trong == không?

Toán tử == so sánh giá trị hoặc đẳng thức của hai đối tượng , trong khi toán tử is của Python kiểm tra xem hai biến có trỏ đến cùng một đối tượng trong bộ nhớ hay không. Trong phần lớn các trường hợp, điều này có nghĩa là bạn nên sử dụng các toán tử đẳng thức == và. =