【问题标题】:TypeError: unbound method get_pet() must be called with DogFactory instance as first argument (got nothing instead)TypeError:必须使用 DogFactory 实例作为第一个参数调用未绑定的方法 get_pet()(什么都没有)
【发布时间】:2014-08-06 15:06:38
【问题描述】:

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

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

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

谢谢大家。

【问题讨论】:

    标签: python


    【解决方案1】:

    你忘了实例化你的工厂:

    def main():
        FactoryCls = random.choice([DogFactory, CatFactory])
        petshop = PetShop(FactoryCls())
        print petshop.get_pet()
    

    这会导致self.pet_factory.get_pet() 中的PetShop 在工厂class 上调用get_pet() 时失败。

    这失败了,因为get_pet 是一个方法,您应该从实例“调用”它:

    DogFactory().get_pet()  # Good
    DogFactory.get_pet()    # Bad
    

    或者,您可以在您的工厂类中将get_pet 设为classmethod

    【讨论】:

    • 谢谢!我明白了。 factory = random.choice([DogFactory, CatFactory])() 也可以。最美好的祝愿!
    猜你喜欢
    • 1970-01-01
    • 2017-07-24
    • 2017-12-23
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多