任何人都可以告訴我如何在運行時在以下代碼中綁定到特定的子類?我想在以下示例中的mCar實例根據命令行選項重定向到Truck或Compact類?Python:在運行時綁定子類
class Car(object):
pass
class Truck(Car):
pass
class Compact(Car):
pass
和Car
mCar = Car()
任何人都可以告訴我如何在運行時在以下代碼中綁定到特定的子類?我想在以下示例中的mCar實例根據命令行選項重定向到Truck或Compact類?Python:在運行時綁定子類
class Car(object):
pass
class Truck(Car):
pass
class Compact(Car):
pass
和Car
mCar = Car()
一個實例你的意思是這樣嗎?
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__
嗨,Gyaa 我認爲它應該在某些情況下工作。 我很好奇,如果在Car :: __ init __() 謝謝 – WuJanJai 2009-09-16 19:31:16
「類型轉換」或改變「__class__」其他方式好嗎你可以使用類工廠,甚至__metaclass__ http://en.wikibooks.org/wiki/Python_Programming/MetaClasses 但除非你真的需要它,它可能是矯枉過正。 – GHZ 2009-09-16 19:42:06
嗨,GHZ 感謝您的指針。這正是我需要的。 – WuJanJai 2009-09-16 19:49:24
作爲一個側面說明,而不是特別推薦,可以分配不同的價值self.__class__
- 是在__init__
或其他地方。請注意,這將改變對類級名稱(例如方法)的查找,但本身不會改變實例的狀態(也不會顯式調用任何類型的初始化 - 如果需要,您必須明確地執行此操作發生)......這些微妙之處是爲什麼這些技巧不被特別推薦(以及Pythonistas對「黑魔法」的一般文化偏見;-)和「工廠功能」(在特別簡單的情況下可以是這樣)減少到字典查找,如在GHZ的答案)是推薦的方法。
非常感謝您的解釋。 自我.__ class__的分配是我在第三方代碼中看到的。但是,在我看來,它需要非常小心地進行處理,正如你所提到的那樣。 – WuJanJai 2009-09-17 17:45:53
此代碼有效。你有什麼問題? – 2009-09-16 19:46:50
正如GHZ所建議的,我想根據一定的運行時間條件在運行時將mCar綁定到Truck或Compact。 – WuJanJai 2009-09-16 19:50:37
「某些運行狀態」?那是什麼意思?你的意思是一個if語句嗎?你能提供你想要做的一些示例代碼嗎? – 2009-09-16 19:52:39