Использование атрибутов класса в качестве параметров функции?

#python #function

#python #функция

Вопрос:

Итак, у меня есть работающий алгоритм сортировки на Python. (Его точное содержимое не имеет отношения к этому вопросу.) Он использует список с именем «люди», содержащий экземпляры класса, и функция жестко запрограммирована для сортировки этого списка по определенному атрибуту «богатство».

 def my_sort(seq):
    # sorts by seq[n].wealth
    ...
my_sort(people)
  

Теперь я хотел бы обобщить функцию, чтобы я мог сортировать по любому атрибуту.

 def my_sort2(seq, key):
    # sorts by seq[n].key
    ...
my_sort2(people, wealth)
  

Но это, конечно, выдает ошибку, потому что он не знает, что нужно рассматривать «богатство» как атрибут класса. Итак, как это возможно сделать?

Комментарии:

1. Из любопытства, что не так с алгоритмом сортировки по умолчанию в Python?

2. У меня есть привычка делать что-то сложным путем, когда я замечаю, что моих навыков в какой-то области недостаточно.

Ответ №1:

Вы могли бы передать имя атрибута:

 def my_sort2(seq, keyname):
    sort by getattr(seq[n], keyname)

my_sort2(people, 'wealth')
  

или функтор getter:

 def my_sort2(seq, keyfunc):
    sort by keyfunc(seq[n])

my_sort2(people, operator.attrgetter('wealth'))
  

Я предпочитаю последний подход, поскольку он более общий. Например, он легко позволяет вычислять ключи.

Ответ №2:

Общая функция получения атрибутов getattr должна работать:

 gettattr(obj, name)