Python的迴圈引用解決方案
最近專案使用django重構,由於使用了代理類繼承models中的類,為了可以使用代理類中的方法,models中的類的外來鍵又是指向代理類的,毫無疑問這樣發生了迴圈引用。
方案一(臨時解決方案---不推薦):在代理類以及models中建立外來鍵所需要引用時,from...import...全部採用區域性引用。
此方案要寫很多很多重複的from...import...顯然不夠優雅
方案二( 我們最終選擇的方案---推薦):models中的外來鍵所引用的類用引號括起來,這樣在第一次載入的時候就算此類沒有被載入也沒有關係,只要你真正呼叫之前載入了這個類就不會出錯,然後將這個檔案中的所有的載入其他類的from...import語句放到檔案的最下面。這樣就是先載入上面全部的類,然後再去載入代理類。代理類中的from...import...也不需要區域性引用,寫在檔案頭部就沒問題了。
方案三(改動太大,放棄):將“代理類繼承model”的模式改成“model繼承外部類”,改變繼承方向。我覺得用一個寫滿屬性的類去繼承一個寫滿方法的類在設計上就怪怪的,也沒有進行驗證是否可行,遂放棄。
方案四(實驗未成功):網上有的解決方案是使用import代替from,實驗沒成功
總結:
1.如果有能力就在架構設計之初儘量避免迴圈引用問題。特別是使用了繼承、工廠、代理類的話要考慮清楚
2.user = models.ForeignKey(User)是可以寫成user = models.ForeignKey('User'),這樣在載入時可以忽略引用順序問題,但是編譯器就沒辦法提醒你這個類到底有沒有引用,不過是小問題。
3.model中只要外來鍵用的是字串,from...import...是可以放在檔案末尾的,不過編譯器會提醒你from語句應該放在檔案頭,小問題。
注:最近加班加成了沙雕,晚些時候測試一下方案三和方案四,並把示例程式碼貼上來。