TypeError:必须使用DogFactory实例作为第一个参数调用未绑定方法get_pet()(没有取而代之)

时间:2014-08-06 15:06:39

标签: python

我将学习抽象工厂模式并编写一些代码用于测试。

有一个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()

我搜索了一些类似的问题但却不知道,如果你能向我解释,那就太好了。

谢谢大家。

1 个答案:

答案 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