Size: a a a

testing_in_python

2021 September 13

T

Tishka17 in testing_in_python
паттерн фабрика
источник

СС

Сказочный Сникерс... in testing_in_python
ну накидай пример кода
источник

T

Tishka17 in testing_in_python
class MyFactory:
   def __init__(self):
      self.last_id=0
   def create(self):
        self.last_id += 1
        return SomeObj(self.last_id)

условно, если не требуется потокобезопасность. Хочешь - создай один раз фабрику и юзай везде, хочешь - создай две фабрики. Хочешь - для тестов не юзай фабрику вообще
источник

СС

Сказочный Сникерс... in testing_in_python
то есть мой SomeObj должен принимать еще один аргумент в конструктуре. а затем его еще и в инстанс запихивать
источник

СС

Сказочный Сникерс... in testing_in_python
при этом атрибут чисто сервисный
источник

T

Tishka17 in testing_in_python
конечно
источник

T

Tishka17 in testing_in_python
Из приятного бонуса - если понадобится вдруг этои id хранить в БД, в случае фабрики вообще никаких пробелм её сконфигурировать для этого
источник

СС

Сказочный Сникерс... in testing_in_python
хорошо. а если у меня есть наследник SomeObj который должен продолжить инкрементацию?
источник

СС

Сказочный Сникерс... in testing_in_python
def create_child в фабрике?)
источник

T

Tishka17 in testing_in_python
как один из вариантов, но надо подумать
источник

СС

Сказочный Сникерс... in testing_in_python
class Class:
   version = 0

   @classmethod
   def up_version(cls):
       cls.version += 1

   def __init__(self):
       self.up_version()


class Child(Class):
   pass
источник

T

Tishka17 in testing_in_python
прекрасно. А теперь что ты будешь делать если тебе вдруг надо два независимых счетчика или счетчик хранить во внешней системе? Или иметь один счетчик на несколько классов не связанных иерархией
источник

T

Tishka17 in testing_in_python
Альтернативный вариант:

class SomeObj:
  def  __init__(self, counter):
      counter.increment()

и передавай везде один counter
источник

СС

Сказочный Сникерс... in testing_in_python
в чем отличие от глобальной переменной?)
источник

T

Tishka17 in testing_in_python
Ты решаешь конкретную проблему таким способом, который не имеет потенциала к изменению. Но зато ты конечно экономишь пару строк кода
источник

T

Tishka17 in testing_in_python
в том, что аргумент надо явным образом передать

counter = SomeCounter()
SomeObj(counter)
SomeObj(counter)
Child(counter)
источник

T

Tishka17 in testing_in_python
это изначально кажется более сложным, так как тербует лучше контролировать жизненный цикл объектов, но в перспективе это чище и гибче
источник

СС

Сказочный Сникерс... in testing_in_python
не могу представить такой ситуации. но даже так

@classmethod
def reset(cls):
   cls.version = 0
источник

T

Tishka17 in testing_in_python
это ты сбросил счетчик, а надо иметь два счетчика, которые оба будут увеличиваться
источник

СС

Сказочный Сникерс... in testing_in_python
че?
источник