2016-10-04 72 views
2

我有一個包含多個文件的包。每個文件都包含一個類,這些類是相互依賴的。如何在不將所有代碼放入一個文件的情況下避免循環依賴。有沒有更好的方式來重構代碼,或者是有解決的圓形進口python3中的循環導入

這是目錄結構

. 
|-- Complainant.py 
|-- Complaint.py 
`-- __init__.py 

Complaint.py方式:

from .Complainant import Complainant 

class Complaint(BaseDocument): 
    ALL_STATUS = ["waiting","resolved", "rejected"] 
    text = TextField() 
    timestamp = DateTimeField() 
    status = TextField() 
    complainant_id = TextField() 
    department_ids = ListField(TextField()) 

    def get_complainant(self): 
     db = DBManager.db() 
     complainant = Complainant.load(db, self.complainant_id) 
     return complainant 

Complainant.py

from .Complaint import Complaint 

class Complainant(BaseDocument): 
    account_type = TextField() 
    account_handle = TextField() 
    complaint_ids = ListField(TextField()) 

    def get_complaints(self): 
     db = DBManager.db() 
     complaints = [Complaint.load(db, i) for i in self.complaint_ids] 
     return complaints 

init.py

from .Complaint import Complaint 
from .Complainant import Complainant 

__all__ = [ 
    Complaint, 
    Complainant 
] 
+0

你可以把進口到相應的類方法。 – skovorodkin

+0

你也可以使用'from來修復它。導入模塊「並使用限定名稱(例如'module.Class'),而不僅僅是類名。但是由於這些類緊密耦合在一起,可能它們應該在同一個模塊中定義? Python不是Java,你不需要把每個類放在它自己的文件中。 – Blckknght

+0

@Blckknght但是將所有內容放在一個文件中是一個很好的設計決策,因爲在一個文件中會有很多代碼 – freeza

回答

0

在具有循環依賴關係的系統中,爲了避免循環導入,通常必須將相互依賴的部分放在同一個模塊中。

在你的情況下,ComplaintComplainant只有一小部分是相互依賴的。您可以重構模塊以將非相互依賴的部分放入BaseComplaint.pyBaseComplainant.py的類中,並使用第三個模塊來定義子類ComplaintComplainant

目錄結構:

. 
|-- BaseComplainant.py 
|-- BaseComplaint.py 
|-- ComplaintComplainant.py 
`-- __init__.py 

BaseComplaint.py:

class BaseComplaint(BaseDocument): 
    ALL_STATUS = ["waiting","resolved", "rejected"] 
    text = TextField() 
    timestamp = DateTimeField() 
    status = TextField() 
    complainant_id = TextField() 
    department_ids = ListField(TextField()) 

BaseComplainant.py

class BaseComplainant(BaseDocument): 
    account_type = TextField() 
    account_handle = TextField() 
    complaint_ids = ListField(TextField()) 

ComplaintComplainant.py(也許你可以找到一個更好的名字)

from .BaseComplaint import BaseComplaint 
from .BaseComplainant import BaseComplainant 

class Complaint(BaseComplaint): 
    def get_complainant(self): 
     db = DBManager.db() 
     complainant = Complainant.load(db, self.complainant_id) 
     return complainant 

class Complainant(BaseComplainant): 
    def get_complaints(self): 
     db = DBManager.db() 
     complaints = [Complaint.load(db, i) for i in self.complaint_ids] 
     return complaints 

init.py

from .ComplaintComplainant import Complaint, Complainant 

__all__ = [ 
    Complaint, 
    Complainant 
]