Питон синглтон против классометрии
Я хочу создать класс обслуживания, который имеет только один экземпляр, поэтому я должен сделать этот класс одноэлементным, или я должен сделать методы как методы класса?
class PromoService():
@classmethod
def create_promo(cls, promotion):
#do stuff
return promo
class DiscountPromoService(PromoService):
@classmethod
def create_promo(cls, promo, discount):
promo = super(DiscountPromoService, cls).create_promo(promo)
promo.discount = discount
promo.save()
return promo
Причина, по которой я не хочу создавать его как модуль, заключается в том, что мне нужно было бы создать подкласс моего сервиса. Какой самый питонный способ сделать это, упомянутый выше способ или сделать синглтон-класс?
2 ответа
Если вы хотите синглтон, идите с синглтоном. Шаблон, указанный здесь, работает хорошо. Вам просто нужно сделать что-то вроде:
class PromoService():
_metaclass__ = Singleton
Краткий ответ: на мой взгляд, это будет работать.
НО, в смысле чистого паттерна, я некоторое время боролся с этим вопросом:
Методы класса Python и атрибуты класса по существу ведут себя как Singleton?
- Все экземпляры этого класса не имеют к ним никакого отношения
- Только сам класс имеет к ним доступ
- Всегда есть один из них
Да, чистое сравнение синглтон-паттернов не получится простым и понятным, но, конечно, это не за горами?
Я бы не стал называть себя экспертом по питону, так что рад узнать, что мнения по этому поводу будут исправлены в моих предположениях.