Предположим, кто-то дал вам существующую пару классов, которые работают вместе:
class non_unique_collection:
def __init__(self):
self.all_items = []
def add_new_item(self, item):
self.all_items.append(item)
def __len__(self):
return len(self.all_items)
## ...
## there are several other useful functions here
## ...
def overlap(self, n_u_tuple):
# do some things here
pass
class non_unique_ranked_collection:
def __init__(self, some_scores_and_items):
self.ranked_items = sorted(some_scores_and_items)
Я хочу использовать многие функции этого класса (например, __len__
), но я хочу изменить что-то очень простое:
class unique_collection(non_unique_collection):
def __init__(self):
self.all_items = set([])
def add_new_item(self, item):
self.all_items.add(item)
Я также хочу использовать свой производный класс unique_collection
с другим новым классом unique_ranked_collection
:
class unique_ranked_collection(non_unique_ranked_collection):
def __init__(self, some_scores_and_items):
# average scores for duplicate items
items_to_scores = {}
for score, item in some_scores_and_items:
if item in items_to_scores:
items_to_scores[item].append(score)
else:
items_to_scores[item] = [ score ]
average_scores_and_unique_items = dict( [ (sum(items_to_scores[item])/float(len(items_to_scores[item])), item) for item in items_to_scores ] )
self.ranked_items = sorted(average_scores_and_unique_items)
Вот мой вопрос:
Что такое лучший способ сделать так, чтобы функцию overlap
можно было использовать с non_unique_collection
и non_unique_ranked_collection
или с unique_collection
и unique_ranked_collection
(но не между типами unique...
и non_unique...
)?Я начал вставлять некоторые утверждения assert, используя isinstance
, но он начал выглядеть беспорядочным, и я хотел попросить совета.
Лучшее, что я мог придумать, - это иметь два базовых класса, которые обаТипы unique...
и non_unique...
наследуются от.Что вы об этом думаете?
Большое спасибо.
PS-- Я знаю, что эта конкретная проблема, для которой написан код, довольно неинтересна, но это всего лишь иллюстрация.