Circular dependency xảy ra khi hai class cần nhau ở thời điểm định nghĩa class (class body chạy ngay lúc định nghĩa).
Vấn đề
class P:
q = Q().do_something() # Lỗi: Q chưa định nghĩa
def do_something(self):
pass
class Q:
p = P().do_something() # Lỗi: P chưa định nghĩa xong
def do_something(self):
pass
Giải pháp: Tách định nghĩa và gán thuộc tính sau
class P:
pass
class Q:
pass
# Gán sau khi cả hai đã định nghĩa xong
P.q = Q.do_something()
Q.p = P.do_something()
Lưu ý: Nếu do_something() của mỗi class phụ thuộc vào việc class kia đã thực hiện xong, cách trên vẫn không đủ. Cần thiết kế lại (dependency injection, lazy initialization, v.v.).
Class directive (gán thuộc tính ở cấp class) chạy lúc định nghĩa class, không lúc tạo instance. Python là ngôn ngữ động - có thể hoàn thiện định nghĩa class sau khi cả hai đã được định nghĩa.