以下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脚本中轻松运行。
答案 0 :(得分: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中删除了旧式类。
答案 1 :(得分:2)
那是因为'banana_cake'不是BananaCake的实例。
CakeFactory实现返回BananaCake CLASS,而不是BananaCake的实例。
尝试修改CakeFactory以返回“BananaCake()”。调用BananCake构造函数将返回一个实例,而不是类。