2009-11-26 27 views
37

Tôi đến từ một nền mà tôi thường tạo một tệp cho mỗi lớp. Tôi cũng tổ chức các lớp học chung theo thư mục. Thực hành này là trực quan với tôi và nó đã được chứng minh là có hiệu quả trong C++, PHP, JavaSript, v.v.Cách tổ chức các mô-đun và gói Pythonic

Tôi gặp khó khăn khi đưa ẩn dụ này vào Python: các tệp không chỉ là các tệp nữa mà còn là các mô-đun chính thức. Nó không có vẻ đúng khi chỉ có một lớp trong một mô-đun --- hầu hết các lớp đều vô dụng. Nếu tôi có một số automobile.py và một lớp Automobile, có vẻ như ngớ ngẩn để luôn tham chiếu nó là automobile.Automobile.

Nhưng, đồng thời, dường như không phải ném một tấn mã vào một tệp và gọi nó là một ngày. Rõ ràng, một ứng dụng rất phức tạp nên có nhiều hơn 5 tệp.

Cách --- --- pythonic chính xác là gì? (Hoặc nếu không có cách nào đúng, cách ưa thích của bạn là gì và tại sao?) Tôi nên ném bao nhiêu mã vào một mô-đun Python?

+0

Trùng lặp: http://stackoverflow.com/questions/1642975/folder-and-file-organization-for-python-development –

+1

Trùng lặp: http://stackoverflow.com/questions/106896/how-many-python -class-nên-i-put-in-one-file –

Trả lời

31

Hãy suy nghĩ về một "đơn vị lôgic hợp lý" - có thể là một lớp đơn, nhưng thường xuyên hơn sẽ là một tập hợp các lớp hợp tác chặt chẽ. Các lớp (hoặc các hàm mức mô-đun - không "làm Java trong Python" bằng cách luôn sử dụng các phương thức tĩnh khi các hàm mức mô-đun cũng có sẵn như là một lựa chọn! -) có thể được nhóm lại dựa trên tiêu chí này. Về cơ bản, nếu hầu hết người dùng của A cũng cần B và ngược lại, A và B có lẽ nên ở trong cùng một mô-đun; nhưng nếu nhiều người dùng sẽ chỉ cần một trong số họ và không phải người khác, thì có lẽ họ nên ở trong các mô-đun riêng biệt (có thể trong cùng một gói, tức là thư mục có tệp __init__.py trong đó).

Thư viện Python chuẩn, trong khi ở xa hoàn hảo, có xu hướng phản ánh (chủ yếu) thực hành tốt hợp lý - vì vậy bạn chủ yếu có thể học từ nó bằng ví dụ. Ví dụ, mô-đun threading tất nhiên xác định một lớp Thread ... nhưng nó cũng giữ các lớp nguyên thủy đồng bộ hóa như khóa, sự kiện, điều kiện và semaphores và lớp ngoại lệ có thể được nâng lên bởi các hoạt động luồng (và một số nhiều điều hơn).Nó nằm ở giới hạn trên của kích thước hợp lý (800 dòng bao gồm khoảng trắng và docstrings), và một số chức năng quan trọng liên quan đến chuỗi như Queue đã được đặt trong một mô-đun riêng biệt, tuy nhiên đó là một ví dụ tốt về số lượng chức năng tối đa mà nó vẫn có ý nghĩa để đóng gói thành một mô-đun duy nhất.

7

Nếu bạn muốn dính vào hệ thống một lớp mỗi tập tin của bạn (đó là logic, đừng hiểu sai ý tôi), bạn có thể làm điều gì đó như thế này để tránh phải tham khảo automobile.Automobile:

from automobile import Automobile 
car = Automobile() 

Tuy nhiên, như đã đề cập bởi cobbal, hơn một lớp cho mỗi tập tin là khá phổ biến trong Python. Dù bằng cách nào, miễn là bạn chọn một hệ thống hợp lý và sử dụng nó một cách nhất quán, tôi không nghĩ rằng bất kỳ người dùng Python nào sẽ nổi giận với bạn :).

4

Trong một dự án cỡ trung bình, tôi đã tìm thấy bản thân mình với một số bộ các lớp liên quan chặt chẽ. Một vài trong số các bộ đó giờ đây được nhóm thành các tệp; ví dụ, các lớp mạng cấp thấp là tất cả trong một mô-đun network. Tuy nhiên, một vài trong số các lớp học lớn nhất đã được tách ra thành tập tin riêng của họ.

Có lẽ cách tốt nhất để bắt đầu đường dẫn từ lịch sử một lớp cho mỗi tệp là lấy các lớp mà bạn thường đặt trong cùng một thư mục và thay vào đó giữ chúng trong cùng một tệp. Nếu tệp đó bắt đầu quá lớn, hãy chia nhỏ tệp đó.

8

Nếu bạn đang đến từ một điểm C++, bạn có thể xem các mô-đun python giống như .so hoặc .dll. Vâng, chúng trông giống như các tệp nguồn, vì python được viết kịch bản, nhưng chúng thực sự là các thư viện có thể tải về các chức năng cụ thể.

Ẩn dụ khác có thể giúp bạn có thể xem các mô-đun python dưới dạng không gian tên.

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