为什么在Python中对正则函数使用类方法

Why use class method over a regular function in python

假设我想要一个对象,它根据输入实例化类,并在调用时返回它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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?

哪种设计更像Python?为什么你会选择一个而不是另一个呢?


工厂对象通常不被认为是非常Python式的;面对这样的问题,一流的对象、方法或函数通常是更好的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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_...开头的工厂提供一组构造函数。

1
2
def from_pet_name(pet: str)-> Pet:
    return pets[pet]()