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会通过名称以
1 2 | def from_pet_name(pet: str)-> Pet: return pets[pet]() |