閱讀細節是的,這是非常有用的,它確實可以一個目的,但也很少有必要這樣做。如果你認爲你需要在定義好補丁程序之後進行補丁,你應該停下來考慮它是否是最好的方法。
一種情況是猴子修補。我在一個龐大的Plone系統中完成了這項工作,其中一些方法需要稍微調整,但是沒有任何簡單的方法可以正常重寫這些行爲。在這種情況下,您有一個複雜的庫,它提供了一種簡單的方法來注入新的或修改的行爲,而無需更改原始庫。
想到的另一種情況是當你想要很多可以自動生成的方法時。例如數據驅動的測試。
def createTest(testcase, somedata, index):
def test(self):
"Do something with somedata and assert a result"
test_name = "test_%d" % index
setattr(testcase, test_name, test)
for index, somedata in enumerate(somebigtable):
createTest(MyTestCase, somedata, index)
時MyTestCase的是你unittest.TestCase生成可以有一個試驗,通過所有的數據流入,但它停止在第一次失敗,你不是要揣摩其中的數據線失敗。通過動態創建方法,所有測試都單獨運行,並且測試名稱告訴您哪一個失敗(上述代碼的原始實際構建的涉及某些數據和索引的更有意義的名稱)。
你不能在類的主體內部這樣做,因爲在定義完成之前,沒有辦法引用類本身或其字典。然而,你可以做一些類似於元類的東西,因爲它可以在創建類本身之前修改類的字典,有時候這也是做類似事情的一種更簡潔的方式。
另一件要注意的是,有些情況下,這將無法正常工作。某些__xxx__
特殊方法在創建類後不能被覆蓋:原始定義保存在除類別__dict__
之外的其他位置,因此稍後進行的任何更改都可能被忽略。另外,如果使用元類,有時候額外的函數將不會得到元類給屬性作爲類定義一部分的任何處理。
有趣!這也暗示了另一個價值觀可能正在推動對其他地方不重要的方法的定義。顯然對於特殊情況。 –