2011-11-09 27 views
5

Tôi đang cố gắng cấu trúc ứng dụng của mình bằng Python. Trở lại từ nền C#/Java, tôi thích cách tiếp cận của một lớp cho mỗi tệp. Tôi muốn cây dự án của tôi trông như thế này:Python một lớp cho mỗi mô đun và gói

[Service] 
    [Database] 
     DbClass1.py 
     DbClass2.py 
    [Model] 
     DbModel1.py 
     DbModel2.py 
    TheService.py 
[ServiceTests] 
    [Database] 
     DbClass1Tests.py 
     DbClass2Tests.py 
    [Model] 
     DbModel1Tests.py 
     DbModel2Tests.py 
    TheServiceTests.py 
  1. Là một lớp cho mỗi cách tiếp cận tập tin OK trong Python?
  2. Có thể tạo ra các gói/module theo cách như vậy để gói làm việc như gói Java hay .NET namespace của, tức là trong DbModel1Tests.py:

    import Service.Model 
    
    def test(): 
        m = DbModel1() 
    
+9

Bạn có thể muốn hãy xem [PEP 8 - Hướng dẫn kiểu cho mã Python] (http://www.python.org/dev/peps/pep-0008/). –

Trả lời

4

Theo tôi, đối với 1: Tôi không hiểu tại sao không. Tôi nghĩ, bất kể ngôn ngữ này là một ý tưởng tốt vì nó cung cấp cho bạn một cái nhìn tổng quát về những gì được tìm thấy trong một tập tin khi bạn biết sẽ chỉ có một lớp duy nhất trong đó. Mặc dù vậy, tôi sẽ tạo một ngoại lệ nhỏ cho các lớp trợ giúp, nhưng vì Python cho phép các lớp lồng nhau này cũng có thể được thực hiện khá độc đáo.

Đối với 2: cũng có thể. Trong ví dụ của bạn, bạn tải mô-đun đơn giản, do đó làm cho các lớp và hàm của nó có sẵn bằng không gian tên đầy đủ.

Vì vậy, nếu bạn nói import Service.Model, bạn chỉ có thể truy cập lớp học bằng cách sử dụng m = Service.Model.DBModel1().

Để nhập mọi thứ vào không gian tên hiện tại, hãy thực hiện from Service.Model import * (hoặc from Service.Model import DBModel1 nếu bạn chỉ cần lớp đó). Sau đó, bạn có thể làm như hiện tại: m = DBModel1().

+5

Kết thúc có vẻ hơi gây nhầm lẫn - sử dụng cấu trúc của OP, sẽ không cần phải viết 'm = DBModel1.DBModel1()' sau 'từ Service.Model import DBModel1' (giả sử tên lớp giống với tên của .py tập tin) ? – jwd

3

Bạn có thể có một lớp cho mỗi mô-đun, nhưng điều này là không cần thiết. Tôi sẽ nói rằng nó liên quan nhiều hơn đến độ dài của mỗi mô-đun (giữ chúng không quá dài luôn luôn là một ý tưởng tốt).

Bây giờ, về cấu trúc của bạn:

  • bạn có thể khai báo các thư mục con của bạn như các gói. Đối với điều này, chỉ cần tạo một tập tin __init__.py trong mỗi thư mục con.
  • lần này được thực hiện, bạn có thể nhập các module như thế này: from Service.Model import DbModel và sử dụng như bạn đã viết: m = DbModel1.DbModel1Class()

Ghi chú:

  • đặt tên tập tin của bạn với chữ cái đầu tiên là chữ hoa là không thực sự Pythonic (nhưng tên lớp nên có nó). Điều này có nghĩa là nó sẽ giống như service.model.dbModel1.DbModel1().
  • bạn có thể làm from Service.Model import DbModel1 để nhập trực tiếp lớp học từ mô-đun DbModel1. Điều này có thể được thực hiện thông qua cài đặt chính xác của nội dung __init__.py (Tôi không biết cách định cấu hình chính xác). Some more informations here.
13

Q1. Bạn có thể sử dụng lớp 1 cho mỗi kiểu tệp trong Python, nhưng điều này là không bình thường.

Q2. bạn sẽ phải sử dụng from Service.Model import * và thực hiện một số nội dung trong số Service/Model/__init__.py thường bị cau mày.Tránh import * bằng Python

Lời khuyên cá nhân của tôi về điều này: Python là không C#/Java. Cố gắng uốn cong nó để làm cho nó trông giống như $ other_language sẽ gây ra sự thất vọng và trải nghiệm người dùng kém.

Hãy ghi nhớ rằng:

  • bạn có thể có những thứ khác hơn là các lớp trong mô-đun Python (chức năng, ví dụ)
  • bạn không phải nhập khẩu một lớp từ một module trừ khi bạn cần khởi tạo lớp đó. Đặc biệt, nếu mã của bạn chỉ sử dụng các trường hợp của DbModel1 được chuyển làm đối số cho các hàm/phương pháp của bạn, không cần nhập vào phần đó của mã
  • từ Service.Model.DbModel1 import DbModel1 trông có vẻ xấu. Ưu tiên from service.model import DbModel1: tránh chữ in hoa trong tên tệp và tên thư mục và nhóm lớp/chức năng hợp lý trong tệp (thay vì nhóm chúng trong thư mục như bạn sẽ làm với lớp 1 trên mỗi tệp hệ thống.)
+0

Tại sao có một lớp cho tệp bất thường trong Python? – Gewthen

+0

@Gewthen nó không phải là bắt buộc bởi ngôn ngữ, vì vậy nó không phải là một thực tế phổ biến. –

+1

Bất kể tôi có đồng ý hay không đồng ý, câu trả lời này có thể hữu ích hơn nếu một số "làm và không" có một số lời giải thích và lý do đằng sau chúng. Đề cập đến pep 8 sẽ giúp ích cho một số điểm của bạn, nhưng những người khác cần nhiều hơn (ví dụ: "thường bị cau mày khi", "có vẻ xấu"). – Gewthen

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