2009-10-05 48 views
1

isinstance下使用似乎並沒有在Python 2.5.2或2.6.2工作:使用Python的isinstance

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腳本中輕鬆運行。

回答

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.

2

這是因爲'banana_cake'不是BananaCake的一個實例。

CakeFactory實現返回BananaCake CLASS,而不是BananaCake的一個實例。

嘗試修改CakeFactory以返回「BananaCake()」。調用BananCake構造函數將返回一個實例,而不是類。

相關問題