使用Python的isinstance

1 投票
2 回答
1792 浏览
提问于 2025-04-15 14:49

下面这个使用 isinstance 的方法在 Python 2.5.2 或 2.6.2 中似乎不太管用:

class BananaCake:
    def __init__(self):
        print 'Banana Cake'

class ChocolateCake:
    def __init__(self):
        print 'Chocolate Cake'

class CakeFactory:
    @staticmethod
    def create(name):
        if name == 'banana':
            return BananaCake
        elif name == 'chocolate':
            return ChocolateCake
        else:
            return None

if __name__ == '__main__':
    banana_cake = CakeFactory.create('banana')
    print isinstance(banana_cake, BananaCake)

上面的 isinstance 返回的是 False,尽管 banana_cake 实际上是 BananaCake 的一个实例。有没有人知道我可能漏掉了什么?我是在我的测试脚本中进行这个检查的。你应该可以轻松地复制粘贴上面的代码,并在 Python 脚本中运行它。

2 个回答

2

这是因为'banana_cake'并不是一个BananaCake的实例。

CakeFactory的实现返回的是BananaCake这个类,而不是BananaCake的一个实例。

试着修改CakeFactory,让它返回"BananaCake()"。这样调用BananaCake的构造函数就会返回一个实例,而不是类本身。

8

你返回的是一个类,而不是这个类的实例。

>>> banana_cake is BananaCake
True

我觉得你想要的是这个:

class CakeFactory:
    @staticmethod
    def create(name):
        if name == 'banana':
            return BananaCake()         # call the constructor
        elif name == 'chocolate':
            return ChocolateCake()      # call the constructor
        else:
            return None

要让 isinstance() 能够和类一起工作,你需要把它们定义为新式类:

class ChocolateCake(object):
    pass

其实你应该把所有的类都声明为新式类,因为这样可以获得更多额外的功能,而且在Python 3中,旧式类已经被淘汰了。

撰写回答