Зачем использовать метод класса над обычной функцией в Python - PullRequest
0 голосов
/ 10 июня 2018

Допустим, я хочу иметь объект, который создает экземпляры классов в зависимости от входных данных и возвращает его при вызове.

from pets import Dog, Cat

class PetCreator:
  @classmethod
  def __call__(cls, pet_type):
    if pet_type == "cat": return Cat()
    elif pet_type == "dog": return Dog()
    else: raise SomeError

def pet_creator(pet_type):
  if pet_type == "cat": return Cat()
  elif pet_type == "dog": return Dog()
  else: raise SomeError

if __name__ == "__main__":
  fav_pet_type = input() # "cat"
  my_cat = pet_creator(fav_pet_type) #this?
  my_cat = PetCreator(fav_pet_type) #or that?

Какой дизайн является более питоническим?И почему вы выбрали один из других

1 Ответ

0 голосов
/ 10 июня 2018

Фабричные объекты часто не считаются очень питоническими;Столкнувшись с такой проблемой, объекты первого класса, методы или функции обычно являются лучшим подходом:

class Pet:
    pass

class Cat(Pet):
    pass

class Dog(Pet):
    pass

pets = {'cat': Cat, 'dog': Dog}

if __name__ == "__main__":
    pet = input()
    my_pet = pets[pet]()

Иногда API предоставляет набор конструкторов через фабрики, чье имя начинается с from_...

def from_pet_name(pet: str)-> Pet:
    return pets[pet]()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...