python進階五(定製類)【5-2 python中__cmp__】

python中 __cmp__

對 int、str 等內置數據類型排序時,Python的 sorted() 按照默認的比較函數 cmp 排序,可是,若是對一組 Student 類的實例排序時,就必須提供咱們本身的特殊方法 __cmp__()python

 1 class Student(object):  2     def __init__(self, name, score):  3         self.name = name  4         self.score = score  5     def __str__(self):  6         return '(%s: %s)' % (self.name, self.score)  7     __repr__ = __str__
 8 #實現print
 9     def __cmp__(self, s): 10         if self.name < s.name: 11             return -1
12         elif self.name > s.name: 13             return 1
14         else: 15             return 0 16 #實現比較類中名字(name)屬性的大小,s是傳入的實例

上述 Student 類實現了__cmp__()方法,__cmp__用實例自身self和傳入的實例 s 進行比較,若是 self 應該排在前面,就返回 -1,若是 s 應該排在前面,就返回1,若是二者至關,返回 0。函數

Student類實現了按name進行排序:spa

>>> L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 77)] >>> print sorted(L) [(Alice: 77), (Bob: 88), (Tim: 99)]

注意: 若是list不單單包含 Student 類,則 __cmp__ 可能會報錯,這裏是一個list中均爲student類的按照name進行大小排血的特殊方法:code

1 L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello'] 2 print sorted(L)

思考解決:blog

 1 class Student(object):  2     def __init__(self, name, score):  3         self.name = name  4         self.score = score  5 
 6     def __str__(self):  7         return '(%s: %s)' % (self.name, self.score)  8 
 9     __repr__ = __str__
10 
11     def __cmp__(self, s):#解決list中不只有student類,還有包含有數字,字符串等
12         if not isinstance(s,Student):#若是list中的元素不是Student類,就直接調用cmp函數比較
13             return cmp(self.name,str(s)) 14         if self.score>s.score: 15             return-1
16         if self.score<s.score: 17             return 1     
18         else: 19             return cmp(self.name, s.name) 20 L = [Student('Tim', 99), Student('Bob', 88), 100, 'Hello'] 21 print sorted(L)

任務

請修改 Student 的 __cmp__ 方法,讓它按照分數從高到底排序,分數相同的按名字排序。排序

 1 class Student(object):  2     def __init__(self, name, score):  3         self.name = name  4         self.score = score  5 
 6     def __str__(self):  7         return '(%s: %s)' % (self.name, self.score)  8 
 9     __repr__ = __str__
10 
11     def __cmp__(self, s): 12         if self.score == s.score:#若是分數相等,按照名字排序
13             return cmp(self.name, s.name) 14         return -cmp(self.score, s.score) 15 
16 L = [Student('Tim', 99), Student('Bob', 88), Student('Alice', 99)] 17 print sorted(L)
相關文章
相關標籤/搜索