Вы можете использовать шаблон фильтра. В основном это позволяет фильтровать список объектов на основе определенных фильтров, и вы можете легко ввести новый фильтр на более позднем этапе с минимальными изменениями в вашем коде.
Создание интерфейса Criteria
или абстрактного класса.
class Criteria():
def filter(self, request):
raise NotImplementedError("Should have implemented this")
и каждый из ваших фильтров выходит из класса Criteria
. Давайте рассмотрим один из фильтров возрастной фильтр
class AgeFilter(Criteria):
def __init__(self, age=20):
self.age = age
def filter(self, list):
filteredList = []
for item in self.list:
if (item.age > self.age):
# add to the filteredList
return filteredList
Аналогично, вы можете определить другие фильтры, такие как DiseaseFilter
, GenderFilter
, расширяя интерфейс Criteria
.
Вы также можете выполнять логические операции над фильтрами, задав также фильтры And
или Or
. Например,
class AndFilter(Criteria):
def __init__(self, filter1, filter2):
self.filter1 = filter1
self.filter2 = filter2
def filter(self, list):
filteredList1 = filter1.filter(list)
filteredList2 = filter2.filter(filteredList1)
return filteredList2
Предполагая, что вы уже определили свои фильтры, после чего ваш метод subject_selection_steps
будет выглядеть так:
def subject_selection_steps(self):
# define list of filters
filterList = [ageFilter1, maleFilter, MalariaAndJaundiceFilter]
result = personList
for criteria in filterList:
result = criteria.filter(result)
return result