python中包的循环导入_具有继承的包中的循环导入依赖项
這是一個可怕的Python循環導入參數,但是,IMHO,您可以有一個優秀的設計,仍然需要循環引用。在
所以,試試這個方法:
在東西.py公司名稱:class Thing(Base):
def action(self):
...do something with otherthing.Otherthing()...
import otherthing
在潛移默化.py公司名稱:
^{pr2}$
在其他東西.py公司名稱:class Otherthing(Base):
def action(self):
... do something with subthing.Subthing()...
import subthing
這里發生了一些事情。首先,一些背景。在
由于導入在Python中的工作方式,當計算引用該模塊的其他模塊中的未來導入語句時,正在導入的模塊(但尚未完全解析)將被視為已導入。因此,您可以在一個模塊上引用一個符號,而該模塊仍處于解析過程中—如果解析還沒有完成到您需要的符號,它將找不到,并將拋出一個異常。在
解決這一問題的一種方法是使用“尾部進口”。此技術的目的是在潛在地觸發其他模塊的導入之前定義引用此模塊的其他模塊可能需要的任何符號。在
處理循環引用的另一種方法是從基于from的導入轉移到普通的import。這有什么幫助?當您有一個from樣式的導入時,目標模塊將被導入,然后from語句中引用的符號將立即在module對象上查找。在
使用普通的import語句,引用的查找將被延遲,直到某個對象對模塊執行實際的屬性引用。這通常可以被下推到一個函數或方法中,在所有導入完成之前,通常不應執行該函數或方法。在
當類層次結構中有循環引用時,這兩種技術不起作用。導入必須在子類定義之前進行,并且當命中class語句時,表示超級類的屬性必須在那里。您所能做的最好的就是使用一個普通的import,通過模塊引用這個超級類,并希望您可以重新安排足夠的代碼以使其正常工作。在
如果您仍然停留在這一點上,另一種可以幫助您的技術是使用訪問器函數來協調一個模塊和另一個模塊之間的訪問。例如,如果您在一個模塊中有類A,并且希望從另一個模塊引用它,但由于循環引用而無法引用,那么您有時可以創建第三個模塊,其中的函數只返回對類A的引用。如果您將其歸納為一組訪問器函數,那么這并不像聽起來那么麻煩。在
如果其他方法都失敗了,您可以將import語句移到函數和方法中,但我通常將其作為最后的手段。在
-編輯-
只是想補充一些我最近發現的新東西。在“class”語句中,超級類實際上是一個Python表達式。所以,你可以這樣做:>>> b=lambda :object
>>> class A(b()):
... pass
...
>>> a=A()
>>> a
>>> a.__class__.__mro__
(, )
>>>
這允許您定義和導入一個訪問器函數,以便從另一個類定義訪問一個類。在
總結
以上是生活随笔為你收集整理的python中包的循环导入_具有继承的包中的循环导入依赖项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wave文件 fft_STM32F103
- 下一篇: python一个try块后接一个或多个f