2009-09-16 62 views
0

任何人都可以告訴我如何在運行時在以下代碼中綁定到特定的子類?我想在以下示例中的mCar實例根據命令行選項重定向到Truck或Compact類?Python:在運行時綁定子類

class Car(object): 
    pass 

class Truck(Car): 
    pass 

class Compact(Car): 
    pass 

Car

mCar = Car() 
+0

此代碼有效。你有什麼問題? – 2009-09-16 19:46:50

+0

正如GHZ所建議的,我想根據一定的運行時間條件在運行時將mCar綁定到Truck或Compact。 – WuJanJai 2009-09-16 19:50:37

+0

「某些運行狀態」?那是什麼意思?你的意思是一個if語句嗎?你能提供你想要做的一些示例代碼嗎? – 2009-09-16 19:52:39

回答

4

一個實例你的意思是這樣嗎?

car_classes = { 
'car'  : Car, 
'truck' : Truck, 
'compact' : Compact 
} 

if __name__ == '__main__': 
    option = sys.argv[1] 
    mCar = car_classes[option]() 
    print 'I am a', mCar.__class__.__name__ 
+0

嗨,Gyaa 我認爲它應該在某些情況下工作。 我很好奇,如果在Car :: __ init __() 謝謝 – WuJanJai 2009-09-16 19:31:16

+1

「類型轉換」或改變「__class__」其他方式好嗎你可以使用類工廠,甚至__metaclass__ http://en.wikibooks.org/wiki/Python_Programming/MetaClasses 但除非你真的需要它,它可能是矯枉過正。 – GHZ 2009-09-16 19:42:06

+0

嗨,GHZ 感謝您的指針。這正是我需要的。 – WuJanJai 2009-09-16 19:49:24

1

作爲一個側面說明,而不是特別推薦,可以分配不同的價值self.__class__ - 是在__init__或其他地方。請注意,這將改變對類級名稱(例如方法)的查找,但本身不會改變實例的狀態(也不會顯式調用任何類型的初始化 - 如果需要,您必須明確地執行此操作發生)......這些微妙之處是爲什麼這些技巧不被特別推薦(以及Pythonistas對「黑魔法」的一般文化偏見;-)和「工廠功能」(在特別簡單的情況下可以是這樣)減少到字典查找,如在GHZ的答案)是推薦的方法。

+0

非常感謝您的解釋。 自我.__ class__的分配是我在第三方代碼中看到的。但是,在我看來,它需要非常小心地進行處理,正如你所提到的那樣。 – WuJanJai 2009-09-17 17:45:53