Giới thiệu
Đối với Java, Dependency Injection hoạt động như OOP thuần túy, tức là bạn cung cấp một giao diện được triển khai và trong mã khung của bạn chấp nhận một thể hiện của một lớp triển khai giao diện đã xác định.
Bây giờ đối với Python, bạn có thể làm theo cách tương tự, nhưng tôi nghĩ rằng phương pháp đó quá tốn kém ngay trong trường hợp của Python. Vậy thì bạn sẽ thực hiện nó theo cách Pythonic như thế nào?
Trường hợp sử dụng
Giả sử đây là mã khung:
class FrameworkClass():
def __init__(self, ...):
...
def do_the_job(self, ...):
# some stuff
# depending on some external function
Phương pháp tiếp cận cơ bản
Cách ngây thơ nhất (và có thể là tốt nhất?) Là yêu cầu hàm bên ngoài được cung cấp vào hàm FrameworkClass
khởi tạo, và sau đó được gọi từ do_the_job
phương thức.
Mã khung:
class FrameworkClass():
def __init__(self, func):
self.func = func
def do_the_job(self, ...):
# some stuff
self.func(...)
Mã khách hàng:
def my_func():
# my implementation
framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)
Câu hỏi
Câu hỏi ngắn gọn. Có cách nào tốt hơn Pythonic thường được sử dụng để làm điều này không? Hoặc có thể bất kỳ thư viện nào hỗ trợ chức năng như vậy?
CẬP NHẬT: Tình hình bê tông
Hãy tưởng tượng tôi phát triển một khuôn khổ web vi mô, xử lý xác thực bằng cách sử dụng mã thông báo. Khung này cần một chức năng để cung cấp một số ID
thu được từ mã thông báo và nhận được người dùng tương ứng với nó ID
.
Rõ ràng, khung công tác không biết bất kỳ điều gì về người dùng hoặc bất kỳ logic cụ thể nào khác của ứng dụng, vì vậy mã máy khách phải đưa chức năng nhận người dùng vào khung để xác thực hoạt động.
AttributeError
hoặcTypeError
được nâng lên theo cách khác), nhưng nếu không thì nó giống nhau.