Питон синглтон против классометрии

Я хочу создать класс обслуживания, который имеет только один экземпляр, поэтому я должен сделать этот класс одноэлементным, или я должен сделать методы как методы класса?

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?

  1. Все экземпляры этого класса не имеют к ним никакого отношения
  2. Только сам класс имеет к ним доступ
  3. Всегда есть один из них

Да, чистое сравнение синглтон-паттернов не получится простым и понятным, но, конечно, это не за горами?

Я бы не стал называть себя экспертом по питону, так что рад узнать, что мнения по этому поводу будут исправлены в моих предположениях.

Другие вопросы по тегам