2010-01-27 28 views
5
class x: 
    def __init__(self,name): 
     self.name=name 

    def __str__(self): 
     return self.name 

    def __cmp__(self,other): 
     print("cmp method called with self="+str(self)+",other="+str(other)) 
     return self.name==other.name 
     # return False 


instance1=x("hello") 
instance2=x("there") 

print(instance1==instance2) 
print(instance1.name==instance2.name) 

Sản lượng ở đây là:__cmp__ phương pháp này không hoạt động như mong đợi trong Python 2.x?

cmp method called with self=hello,other=there 
True 
False 

Mà không phải là những gì tôi mong đợi: Tôi đang cố gắng để nói 'hai trường hợp đều bình đẳng nếu các lĩnh vực tên đều bình đẳng'.

Nếu tôi chỉ đơn giản là return False từ chức năng __cmp__, điều này cũng báo cáo là True! Nếu tôi trả lại -1, thì tôi nhận được False - nhưng vì tôi đang cố gắng so sánh các chuỗi, điều này không cảm thấy đúng.

Tôi đang làm gì sai ở đây?

Trả lời

9

__cmp__(x,y) phải trả lại một số tiêu cực (ví dụ -1) nếu x < y, một số dương (ví dụ 1) nếu x > y và 0 nếu x == y. Bạn không bao giờ nên trả lại một boolean với nó.

Điều bạn đang quá tải là __eq__(x, y).

+0

Thankyou - bạn nhận được dấu tích (mặc dù những người khác cung cấp thông tin tương tự), vì đây là giải thích rõ ràng nhất! – monojohnny

+0

Khi người khác nhận xét, __cmp __() đã lỗi thời. Xác định __lt __(), __eq __() và __gt __() để thay thế. Theo http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons – smci

2

__cmp__() là lỗi thời. Xác định __lt__(), __eq__()__gt__() thay thế.

Mặc dù vậy, bạn đang làm sai. Bạn phải trả về một số nguyên.

+0

"lỗi thời" ?? Bạn đã chọn cái này từ đâu? Những người khác tồn tại, nhưng trong hầu hết các trường hợp, nó có ý nghĩa hơn để sử dụng __cmp__, trong trường hợp này, ví dụ, nó sẽ có 3 phương pháp thay vì chỉ một. http://docs.python.org/reference/datamodel.html – jsbueno

+1

@jsbueno: Điểm dấu đầu dòng thứ ba: http://docs.python.org/dev/3.0/whatsnew/3.0.html#ordering-comparisons –

+0

URL đã di chuyển để http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons – smci

5

phương thức __cmp__ phải trả về -1, 0 hoặc 1, khi tự < khác, tự == khác, tự> tôn trọng khác.

Bạn có thể làm

return cmp(self.name, other.name) 

trong mã của bạn cho một kết quả đúng

+0

Cảm ơn! Hóa ra tôi có nghĩa là '__eq__'! – monojohnny

0

Lookup tài liệu cho __cmp__, bạn đang phải trả về một số nguyên:

nên trả về một số nguyên âm nếu tự < khác, bằng không nếu tự == khác, một số nguyên dương nếu tự> khác.

4

Bạn đang bối rối __cmp__ với __eq__.

From the documentation of __cmp__:

nên trả về một số nguyên âm nếu tự < khác, bằng không nếu tự == khác, một số nguyên dương nếu tự> khác.

__eq__ trả về một boolean mà quyết định nếu hai đối tượng đều bình đẳng, __cmp__ trả về một số nguyên mà quyết định nếu hai đối tượng là lớn hơn hoặc ít hơn mỗi khác, và do đó được gọi là trừ khi bạn có cụ __eq__, __ne__, __le__, __ge__, __lt____gt__ phương pháp.

Trong trường hợp của bạn, bạn muốn có phương thức __cmp__ thay vì __eq__ vì nó sẽ giúp bạn tiết kiệm thực hiện 5 phương pháp khác cho các so sánh khác.

Bạn có thể sử dụng cmp() function và đặt sau đây trong phương pháp __cmp__ của bạn:

return cmp(self.name,other.name) 

Note, as highlighted by Ignacioisn't the preferred method in Python 3.0 này, nhưng bằng Python 2.x __cmp__ là con đường để đi.

Các vấn đề liên quan