Наследование классов в ООП на python
Столкнулся с такой проблемой: Нужно подсчитать количество клиентов. В моём случае, я подумал создать в экземплярах класса последнее поле (popularity) и подсчитать их сумму То есть количество клиентов: это popularity класса Econom + popularity класса Usual_Tarif и т.д То есть ответ должен быть такой: количество клиентов = 30 000 + 50 000 + 43 000 + 71 000 = 194 000 Но как их суммировать не могу сообразить
class Usual_Tarif:
def __init__(self, name, calls, internet, price, popularity):
self.name = name
self.type = calls
self.internet = internet
self.price = price
self.popularity = popularity
class Econom(Usual_Tarif):
pass
class Smart(Usual_Tarif):
pass
class Unlimited(Usual_Tarif):
pass
class Client:
pass
# ********** Все тарифы ****************
econom = Econom("Эконом", 60, 1000, 60, 30000)
# 60 (минут) звонки; Интернет: 1000 МБ; Цена: 60 (грн/мес), 30000 тисяч клиентов
usual = Usual_Tarif("Стандарт", 90, 750, 45, 50000)
smart = Smart("Развлечение без границ", 200, 2500, 125, 43000)
unlimited = Unlimited("Полный безлимит", 1440, 100000, 250, 71000)
Ответы (1 шт):
Автор решения: rusnasonov
→ Ссылка
- Если вы хотите при каждом инстанцировании класса увеличивать некий глобальный счетчик, то нужно поле
popularityобъявить не на уровне экземпляра, а на уровне класса, и обращаться к нему по имени класса:
class Usual_Tarif:
POPULARITY = 0
def __init__(self, name, calls, internet, price, popularity):
self.name = name
self.type = calls
self.internet = internet
self.price = price
Usual_Tarif.POPULARITY += popularity
- Но я бы так не делал, так как такой код сложнее поддерживать и понимать, и глобальные переменные это как известно антипаттерн. Как по мне, лучше выделить интерфейс
Tariff, и другим классам реализовывать этот интерфейс. Ну а дальше работать с этими тарифами без углубления в реализацию
class Tariff:
def popularity(self) -> int:
raise NotImplementedError()
class Econom(Tarif):
def __init__(self, popularity):
self._popularity = popularity
def popularity() -> int:
return self._popularity
class Smart(Tarif):
def __init__(self, popularity):
self._popularity = popularity
def popularity() -> int:
return self._popularity
class Unlimited(Usual_Tarif):
def __init__(self, popularity):
self._popularity = popularity
def popularity() -> int:
return self._popularity
total_popularity = sum(t.popularity() for t in [econom, usual, smart, unlimited])
- Я конечно не в курсе вашей доменной области. Но то, что тариф знает о количестве человек, которые его используют — это странно. Тут скорее наоборот, человек должен знать, какой тариф использовать. А если нужно посчитать распределение тарифов, то должна быть уже другая сущность, например
TariffReport