1. 程式人生 > >Python:orderable協議

Python:orderable協議

#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: [email protected]
@software: PyCharm
@file: orderable協議.py
@time: 2018/11/7 17:14
"""

"""
1、列表可以使用sort()方法進行排序。其他iterable物件(包括列表),可以使用sorted()函式,可指定reverse
   和key引數,不會改變原序列,排序結果以新序列返回。
2、自定義類例項若想使用sorted排序,可以定義__lt__()方法。
3、自定義類排序排序也可以直接給sorted的key引數指定operator模組的attrgetter。
4、有索引結構的可以使用operator模組的itemgetter。
"""
from operator import attrgetter,itemgetter

class Tester:
    def __init__(self,name,age,rank):
        self.name = name
        self.age = age
        self.rank = rank

    def __str__(self):
        return "{name}--{age}--{rank}".format(**vars(self))

    def __repr__(self):
        return self.__str__()

    def __lt__(self, other):
        if hasattr(other,"name"):
            return self.name < other.name
        return False

class Tester1:
    def __init__(self,name,age,rank):
        self.name = name
        self.age = age
        self.rank = rank

    def __str__(self):
        return "{name}--{age}--{rank}".format(**vars(self))

    def __repr__(self):
        return self.__str__()

testers = (Tester("cxj",18,"3高階"),Tester("xiaoming",28,"2中級"),Tester("lily",38,"1低階"))
print(sorted(testers))
#列印[cxj--18--3高階, lily--38--1低階, xiaoming--28--2中級]

testers1 = (Tester1("cxj",18,"3高階"),Tester1("xiaoming",28,"2中級"),Tester1("lily",38,"1低階"))
print(sorted(testers1,key=attrgetter("age")))
#列印[cxj--18--3高階, xiaoming--28--2中級, lily--38--1低階]

testers2 = (("cxj",18,"3高階"),("xiaoming",28,"2中級"),("lily",38,"1低階"))
print(sorted(testers2,key=itemgetter(2)))
#列印[('lily', 38, '1低階'), ('xiaoming', 28, '2中級'), ('cxj', 18, '3高階')]