使用Python的isinstance
下面这个使用 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中,旧式类已经被淘汰了。