Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Xử lý circular dependency (phụ thuộc vòng) giữa class Python

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.