2010-01-19 26 views
29

Tôi hoàn toàn mới đối với Python nói chung.Tôi có nên tạo từng lớp trong tệp .py của riêng mình không?

Tôi biết rằng tôi có thể tạo nhiều lớp trong cùng một tệp .py, nhưng tôi tự hỏi liệu mình có nên tạo từng lớp trong tệp .py của riêng nó không.

Trong C# chẳng hạn, tôi sẽ có một lớp xử lý tất cả các tương tác Cơ sở dữ liệu. Sau đó, một lớp học khác có quy tắc kinh doanh.

Đây có phải là trường hợp trong Python không?

Trả lời

25

No. Kiểu Python điển hình là đặt các lớp liên quan trong cùng một mô-đun. Nó có thể là một lớp học kết thúc trong một mô-đun của riêng mình (đặc biệt là nếu nó là một lớp lớn), nhưng nó không phải là một mục tiêu theo đúng nghĩa của nó. Và khi bạn làm, xin vui lòng không đặt tên mô-đun sau khi lớp học - bạn sẽ chỉ gây nhầm lẫn cho bản thân và những người khác về cái nào.

+4

Đến từ Java Tôi đã có cùng một câu hỏi này, cậu bé đã nhầm lẫn trong một thời gian. :-) – snarkyname77

+0

Thật thú vị, PyDev cung cấp cho bạn tùy chọn để thực hiện điều đó. – Uri

+0

Nếu bạn nhập một lớp từ một tệp có nhiều lớp, liệu trình thông dịch có thực thi tất cả các lớp trong tệp đó không? –

8

Mỗi tệp .py đại diện cho một mô-đun, vì vậy bạn nên giữ các nhóm logic của hàm, hằng số và các lớp với nhau trong cùng một tệp.

Mỗi lớp trong một file py sẽ chỉ tạo ra sưng lên thiên anh hùng ca trong bảng mô-đun của bạn, vì nếu bạn chỉ quan tâm đến một lớp học mà bạn vẫn có thể

from whatever import SomeClass 
+7

Kiểu Python thường sử dụng 'chữ thường' cho tên mô-đun và' CapWords' cho tên lớp: http://www.python.org/dev/peps/pep-0008/ –

+0

Bạn hoàn toàn đúng Greg, tôi sẽ chỉnh sửa. – richo

+0

Đôi khi phong cách ngớ ngẩn. Nếu bạn có một lớp Foo, hãy tiếp tục và đặt nó trong mô-đun Foo.py. Tại sao bạn đặt nó trong foo.py? Vì vậy, bạn có thể viết 'từ foo nhập khẩu Foo'? Bằng cách viết '__all__ = ['Foo']' trong module, bạn có thể gõ 'từ foo import *' hoặc 'từ Foo import *' và sẽ không có sự nhầm lẫn. Vì vậy, tên mô-đun thường là ngớ ngẩn nếu chúng chỉ chứa một lớp. –

1

Có lẽ không. Tệp Python là "mô-đun". Các mô-đun chỉ nên chứa mã độc lập có thể tái sử dụng được. Nếu điều đó bao gồm một số lớp, đó là tiêu chuẩn, thì đó là hoàn toàn ok.

3

Một điểm đáng lưu ý khác là nếu tập tin phát triển quá lớn, bạn luôn có thể chuyển đổi nó thành một gói, dễ dàng tổ chức lại mà không vi phạm mã của khách hàng.

+0

Gói chỉ đơn giản là nhiều tệp (nhiều mô-đun). Vì vậy, câu trả lời của bạn về cơ bản là nói rằng có, mỗi lớp nên đi trong tập tin riêng của mình (mô-đun) khi số lượng mã quá lớn. –

2

Tôi sẽ không đồng ý với những người khác và nói có. Đối với tôi, tôi đã thành công hơn trong việc đưa từng lớp vào một tệp riêng (mô-đun). Nhưng có những ngoại lệ vì vậy hãy để tôi giải thích bằng một ví dụ.

Nếu bạn có một lớp Foo, sau đó đặt nó trong một tập tin gọi là Foo.py, với các phần sau:

  1. Imports
    • Đây là nơi bạn kéo vào phụ thuộc.
    • Ví dụ: import math, from Bar import *
  2. Globals
    • Đây là nơi bạn xác định các giao diện bên ngoài để mô-đun của bạn, đó là tất cả những biểu tượng nằm ngoài nhìn thấy được của mô đun này.
    • Ví dụ: __all__ = ['Foo']
    • Đây cũng là nơi bạn có thể xác định biến toàn cầu (xấu) và hằng số toàn cục (tốt). Những hình cầu này không cần xuất khẩu; chúng có thể được tạo ra toàn cầu chỉ để đơn giản hóa mã.
    • Ví dụ: PI = 3.14159 có nghĩa là bạn có thể viết PI, trong khi nếu bạn đã xác định nó trong lớp Foo thì bạn sẽ cần phải viết Foo.PI.
  3. Chức năng
    • Đây là nơi bạn xác định tất cả các chức năng cấp cao có liên quan đến lớp Foo, nhưng không thuộc trong lớp Foo namespace. Đây có thể là hiếm vì các lớp học cho phép cả hai lớp @staticmethods và lớp bên trong.
    • Ví dụ: def print_foo(foo): print(foo)
  4. Lớp
    • Ví dụ: class Foo(object): pass

Đôi khi bạn sẽ muốn đặt nhiều hơn một lớp trong mô-đun tương tự. Bạn nên làm điều này bất cứ khi nào hai hay nhiều lớp liên quan đến khái niệm đến điểm mà bạn hầu như luôn luôn sử dụng chúng cùng nhau và không bao giờ độc lập. Đây là ngoại lệ, không phải là tiêu chuẩn. Trong trường hợp này, hãy thêm tất cả các tên lớp vào __all__ toàn cầu.

Cuối cùng, đối với mỗi mô-đun Foo.py, phải có một mô-đun thử nghiệm đơn vị tương ứng được gọi là testFoo.py.

1

Có từng lớp trong tệp riêng của nó. Việc nhập khẩu ngay cả một lớp đơn (hoặc hàm) trong một tệp có nhiều lớp khiến cho python thực thi định nghĩa của tất cả các lớp trong tệp. Hãy thử điều này:

manyClass.py

class foo(): 
    print 'a bunch of time consuming work' 

class tryme(): 
    print 'try me' 

Bây giờ gõ này trong vỏ thông dịch viên ...

từ manyClasses nhập tryme

một bó thời gian làm việc
tốn thử tôi

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