这是另一个使用^{}的版本。我认为在这里给Employee类a.sortclassmethod是有意义的。我从andrejkesely“借用”了__repr__方法和测试数据。;)from operator import attrgetter
class Employee:
allEmployees = []
def __init__(self, name, age):
self.name = name
self.age = age
Employee.allEmployees.append(self)
def __repr__(self):
return f'Employee({self.name}, {self.age})'
@classmethod
def sort(cls, attr):
return sorted(cls.allEmployees, key=attrgetter(attr))
Employee('John', 30)
Employee('Miranda', 20)
Employee('Paolo', 42)
print(Employee.sort('name'))
print(Employee.sort('age'))
输出
^{pr2}$
operator.attrgetter的一个优点是我们可以向它传递多个属性,它将返回一个属性元组。我们可以使用它在一个过程中按多个属性排序。但是我们需要稍微修改.sort方法。其他代码保持不变。在@classmethod
def sort(cls, *attrs):
return sorted(cls.allEmployees, key=attrgetter(*attrs))
Employee('John', 30)
Employee('Miranda', 20)
Employee('Paolo', 42)
Employee('John', 20)
print(Employee.sort('name'))
print(Employee.sort('age'))
print(Employee.sort('name', 'age'))
输出[Employee(John, 30), Employee(John, 20), Employee(Miranda, 20), Employee(Paolo, 42)]
[Employee(Miranda, 20), Employee(John, 20), Employee(John, 30), Employee(Paolo, 42)]
[Employee(John, 20), Employee(John, 30), Employee(Miranda, 20), Employee(Paolo, 42)]