2017-05-09 68 views
1

有沒有辦法快速獲得True/False的關於我是否從我的下面的代碼中生成了ProjectTypeB類的嵌套對象?如何使用For循環在Python字典中的對象上應用isinstance()

class Project(): 
    def __init__(self): 
     self.subProjects={} 

    def addSubProject(self, child): 
     child.parent=child 
     self.subProjects[child.name]=child 

class ProjectTypeA(): 
    def __init__(self, name): 
     self.name=name 

class ProjectTypeB(): 
    def __init__(self, name): 
     self.name=name 

#Create instances 
a=Project() 
a.addSubProject(ProjectTypeA("Project1")) 
a.addSubProject(ProjectTypeB("Project2")) 

從此,我試圖找到一種方法來檢查是否有在a.subProjects對象是從類ProjectTypeB(例如)實例化。我曾嘗試順水推舟的下面幾行,但沒有運氣:

class Project(): 
    #... 

    def ProjectTypeB_Specific(self): 
     with p in self.subProjects: 
      if isinstance(p, ProjectTypeB): 
       # Rest of code... 
+2

'在self.subProjects號碼:'?你的意思是'對於self.subProjects中的p:' –

+1

感謝您指出 - 我不會'修復'我的問題中的代碼,但它會混淆未來的讀者......! – Bendy

回答

3

一個快速的方法來做到這一點是通過any與發電機的表達:

return any(isinstance(p, ProjectTypeB) for p in self.subProjects) 
+0

感謝這看起來很理想 - 雖然我嘗試了下面它與以下,但只是得到FALSE返回(原諒缺乏回車!):如果有(isinstance(p,ProjectTypeB)爲p self.subProjects):print「TRUE 「else:打印」FALSE「....任何想法我可能做錯了什麼? – Bendy

+0

試圖打印'p'它返回'NameError:全局名'p'沒有被定義'...但是'p'不是'self.p'要麼是它? – Bendy

1

是,使用循環結構,如for代替with遍歷它。 with適用於具有非常不同的用例的上下文管理器。

for p in self.subProjects 
    if isinstance(p, ProjectTypeB): 
     # rest of code