<p>这是另一个使用<a href="https://docs.python.org/3/library/operator.html#operator.attrgetter" rel="nofollow noreferrer">^{<cd1>}</a>的版本。我认为在这里给<code>Employee</code>类a<code>.sort</code><a href="https://docs.python.org/3/library/functions.html#classmethod" rel="nofollow noreferrer">classmethod</a>是有意义的。我从andrejkesely“借用”了<code>__repr__</code>方法和测试数据。;)</p>
<pre><code>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'))
</code></pre>
<p><strong>输出</strong></p>
^{pr2}$
<hr/>
<p><code>operator.attrgetter</code>的一个优点是我们可以向它传递多个属性,它将返回一个属性元组。我们可以使用它在一个过程中按多个属性排序。但是我们需要稍微修改<code>.sort</code>方法。其他代码保持不变。在</p>
<pre><code> @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'))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>[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)]
</code></pre>