我将学习抽象工厂模式并编写一些代码用于测试。
有一个DogFactory和一个CatFactory,我想用PetFactory来归还宠物。
但是得到一个错误 TypeError:必须使用DogFactory实例作为第一个参数调用未绑定方法get_pet()(没有取而代之) 脚本是:
import random
class PetShop(object):
"""A Pet Shop"""
def __init__(self, animal_factory=None):
self.pet_factory = animal_factory
def get_pet(self):
return self.pet_factory.get_pet()
def get_food(self):
return self.pet_factory.get_food()
class Dog(object):
def speak(self):
return "woof"
def __str__(self):
return "Dog"
class Cat(object):
def speak(self):
return "meow"
def __str__(self):
return "Cat"
class DogFactory(object):
"""Create a Dog"""
def get_pet(self):
return Dog()
def get_food(self):
return "dog food"
class CatFactory(object):
"""Create a Cat"""
def get_pet(self):
return Cat()
def get_food(self):
return "Cat food"
def main():
factory = random.choice([DogFactory, CatFactory])
petshop = PetShop(factory)
print petshop.get_pet()
if __name__ == "__main__":
main()
我搜索了一些类似的问题但却不知道,如果你能向我解释,那就太好了。
谢谢大家。
答案 0 :(得分:1)
你忘了实例化你的工厂:
def main():
FactoryCls = random.choice([DogFactory, CatFactory])
petshop = PetShop(FactoryCls())
print petshop.get_pet()
这导致self.pet_factory.get_pet()
PetShop
在工厂类上调用get_pet()
时失败。
此操作失败,因为get_pet
是一种方法,您应该拨打"来自" 实例:
DogFactory().get_pet() # Good
DogFactory.get_pet() # Bad
或者,您可以在工厂类中get_pet
classmethod
。