2012-03-13 29 views
19

Tôi đã tự hỏi nếu vượt qua các đối tượng mô-đun cho một lớp hoặc đối tượng đòi hỏi nó hơn là sử dụng import có thể không phải là một ý tưởng tồi, vì nó tránh phụ thuộc cứng vào các mô-đun.Python - 'nhập' hoặc chuyển mô-đun làm tham số?

Tôi đã tự hỏi nếu ai đó nhận thức rõ hơn về Zen Zen hơn tôi có thể giải thích tại sao đây là một ý tưởng khủng khiếp/không khủng khiếp?

+0

Có vẻ như tiêm phụ thuộc và thực sự cũng giống như một ý tưởng hay. Tuy nhiên, bạn có thường xuyên cần một mô-đun toàn bộ, thay vì một hoặc hai chức năng/lớp học không? – delnan

Trả lời

23

Điều bạn đang nói đến được gọi là dependency injection và được xem là phương pháp hay để làm cho mã của bạn có thể kiểm tra. Tôi không nghĩ rằng có bất cứ điều gì về Python mà sẽ làm cho nó unPythonic hoặc một thực hành xấu.

Có nhiều cách khác bạn có thể làm điều đó bằng Python, ví dụ bằng cách nhập các module khác nhau tùy thuộc vào một số loại cờ bạn vượt qua trong:

class Foo(object): 
    def __init__(self, testing=False): 
     if testing: 
      import module_test as module 
     else: 
      import module 
     self.module = module 

Nhưng qua một tham chiếu đến các module bạn muốn sử dụng là linh hoạt hơn, tách mối quan tâm tốt hơn và không kém phần Pythonic hơn là chuyển một tham chiếu đến một lớp hoặc một cá thể (hoặc chuỗi hoặc số nguyên) mà bạn muốn sử dụng.

Đối với trường hợp sử dụng thông thường (không kiểm tra), bạn có thể sử dụng một giá trị tham số mặc định:

class Foo(object): 
    def __init__(self, module=None): 
     if not module: 
      import module 
     self.module = module 
+0

Tôi đoán đó là một cảm giác ruột rằng việc loại bỏ hàng nhập khẩu là một chút 'sai' – Magnus

3

Nếu lớp trong câu hỏi có thể sử dụng một trong những module khác nhau, sau đó nó có thể làm cho tinh thần để vượt qua trong cái bạn muốn nó sử dụng.

Trong mọi trường hợp tôi đã gặp phải cho đến nay, tuy nhiên, các mô-đun cần thiết là chắc chắn, do đó, việc sử dụng import sẽ được ưu tiên hơn.

Các vấn đề liên quan