2012-05-08 18 views
5

Gần đây tôi đã được thông báo rằng tôi nên giữ mã của mình trong các tệp riêng biệt; như main.py, engine.py, settings.py và cứ tiếp tục như vậy. Mặc dù điều này chắc chắn không có lợi ích, như quản lý dễ dàng hơn, khả năng mở rộng và những thứ khác, với tôi có vẻ như nó có quá nhiều hạn chế ...Làm cách nào để sắp xếp mã Python của tôi thành nhiều lớp?

Ví dụ: nếu tôi có một tập lệnh có tên là settings.py. các đối tượng, tốc độ mô phỏng và màu sắc của các đối tượng khác nhau được xác định, tôi phải làm gì nếu các biến đó là cần thiết trong cả tập lệnh engine.py và tập lệnh main.py của tôi? Tôi có nhập hai lần trong cả hai tập lệnh không? Nó có vẻ khá lộn xộn. Điều gì sẽ xảy ra nếu một số lớp học của tôi có trong tập lệnh engine.py, yêu cầu mã từ main.py?

Hãy để tôi chỉ cho bạn những tình huống chính xác ...

main.py Kịch bản của tôi nhập khẩu Pygame trong chính nó, khởi tạo nó, và vân vân. Nó được sử dụng để có một lớp đại diện cho một đối tượng trên màn hình, và lớp đó có một phương thức draw, mà chỉ được gọi là một chức năng vẽ Pygame. Bây giờ, khi tôi đặt lớp bên trong kịch bản engine.py của tôi, mọi thứ không còn hoạt động nữa, vì Pygame không tồn tại ở đó! Tôi đã nhập cả settings.py và Pygame vào engine.py, sau đó nhập động cơ vào main.py, nhưng sau đó nó giống như một bộ khởi tạo hơn một động cơ ... Có cách nào để xử lý những thứ như thế này, như các đường dẫn chung không?

+1

Dường như bạn đang cố gắng thu thập các mô-đun nhập vào đó bạn đã chia nhỏ mã của mình. Nếu đây là trường hợp, bạn nên thực sự chỉ cần nhập khẩu bất cứ nơi nào cần thiết. – inspectorG4dget

+10

Bất kỳ rắc rối nào bạn cảm thấy chia nhỏ mã của bạn thành nhiều tệp sẽ trở nên nhợt nhạt so với khi bạn phải quay lại và duy trì một tệp 5000 dòng mà bạn chưa xem xét trong một vài tháng! –

Trả lời

3

Dưới đây là những hướng dẫn PEP chính thức cho nhập khẩu: http://www.python.org/dev/peps/pep-0008/#imports

Cũng xin xem câu hỏi StackOverflow này: What are good rules of thumb for Python imports?

Bạn có thể nhập một biến từ nhiều hơn một lớp mà không có một vấn đề nhưng bạn nên cố gắng và cấu trúc của bạn mã để mọi thứ không được nhập khẩu tròn. Circular import dependency in Python

1

Bạn nên xem mô hình này, điều này có thể giúp bạn hiểu mọi thứ. Tôi nghĩ rằng đây là một trong đó sẽ thực sự phù hợp nhất với những gì bạn muốn làm

Model-View-Controller

Một số doc thêm ở đây: http://www.wkoorts.com/wkblog/2007/12/23/mvc-design-patterns-with-python-links/

Trong trường hợp này, hàng nhập khẩu nên có vẻ khá hợp lý và cần thiết . Và tôi sẽ thêm đó là gần như những gì bạn đã làm với 3 tệp của bạn.

+0

MVC phải làm gì với câu hỏi? – rantanplan

+0

Từ lời giải thích, âm thanh hợp lý với tôi rằng anh ta mô tả một MVC (dữ liệu, chức năng cốt lõi và giao diện người dùng) – jlengrand

+0

Ngay cả khi 'dữ liệu', 'lõi' và' giao diện người dùng' có thể được chia nhỏ thành hàng chục tệp khác nhau/modules cho mỗi cái. Vì vậy, câu hỏi của ông vẫn được áp dụng. Đó là loại không liên quan tôi nghĩ nhưng tôi sẽ không mod bạn xuống. – rantanplan

1

Không phải là câu trả lời, nhưng:

settings.py thực sự nên settings.ini, và bạn nên đọc nó bằng cách sử ConfigParser. Đọc tệp cấu hình một lần và chia sẻ kết quả ConfigParser.RawConfigParser xung quanh giữa các mô-đun.

+0

Nhưng tại sao? Nó chỉ có vẻ giống như một rắc rối. Tôi có thể có một tập tin '.py' sạch sẽ trông giống' name = value', trái ngược với những phần đó và tất cả những thứ đó ... Ngoài ra, tôi cần một tập lệnh đọc cấu hình, và sau đó tôi cần nhập nó ở mọi nơi khác? Đó không phải là thực tế những gì tôi đang làm ngay bây giờ, ngoại trừ tôi đang thiết lập những giá trị trực tiếp, không đọc chúng từ một tập tin riêng biệt hoặc một cái gì đó? Xin hãy trả lời, tôi muốn biết! – corazza

+0

Không chỉ vậy, nếu tôi, ví dụ, muốn lưu một tuple, nó sẽ trở thành một chuỗi! – corazza

1

Thực hành phổ biến của nó bằng các ngôn ngữ khác (đặc biệt là Java, nơi mà trình biên dịch của trình soạn thảo buộc phải có một tệp cho mỗi lớp.

Đối với phụ thuộc giữa các tệp mà bạn đề cập, bạn nên xem xét tránh các biến toàn cục.

Đây là một câu hỏi khác có liên quan để trả lời câu hỏi của bạn tốt hơn.

How many Python classes should I put in one file?

0

Bạn có thể nhập ký tự từ settings.py trong bất kỳ mô-đun họ là cần thiết. Đó là khái niệm. Một vấn đề thực tế là khi bạn có nhập khẩu vòng tròn. ví dụ. Nếu bạn có một số biểu tượng bên trong engine.py cần thiết trong main.py và ngược lại. Trong tình huống đó, một mẫu chung là phá vỡ các phụ thuộc này trong mô-đun thứ ba, trong đó main.pyengine.py có thể nhập từ, mà không có bất kỳ vấn đề gì.

1

Nhập mô-đun vào nhiều mô-đun khác không hề lộn xộn. Đó là sạch hơn nhiều so với mô-đun có hàng nghìn dòng mã.

Đúng là thông tư nhập là có vấn đề. Nhưng tình hình của bạn không có vẻ như có một vấn đề nhập khẩu vòng tròn. Bạn nói rằng "Bây giờ, khi tôi đặt lớp bên trong kịch bản engine.py của tôi, mọi thứ không còn hoạt động nữa, bởi vì Pygame không tồn tại ở đó! Tôi đã kết thúc nhập cả settings.py và Pygame trong engine.py, sau đó nhập động cơ vào main.py ".

Tại sao bạn không thể đặt lớp học trong engine.py và sau đó nhập nó vào main.py? Một cách rất đơn giản để thực hiện việc này là chuyển một cuộc gọi lại đến lớp học của bạn:

# engine.py 
... 
class ClassWithDraw(Subclass): 
    def __init__(self, draw_callback): 
     ... 
     self._draw_func = draw_callback 
     ... 
    def draw(self): 
     self._draw_func() 

# main.py 

from engine import ClassWithDraw 
drawer = ClassWithDraw(drawfunc) 

Điều tốt đẹp về cách tiếp cận này là đối tượng thực sự chỉ chịu trách nhiệm một điều: trạng thái riêng của nó. Thật vậy, nó có thể có ý nghĩa hơn đối với đối tượng này để không có phương thức draw nào cả; hoặc nó có thể có một số draw_hook sẽ được gọi để lấy dữ liệu có thể vẽ được từ nó bất cứ khi nào cần thiết và một chức năng vẽ bên ngoài khác có thể gọi nó.

Tuy nhiên, một cách tiếp cận khác sẽ là có một mô-đun hoàn toàn riêng biệt cho Pygame. Tôi không biết nhiều về Pygame, do đó, nó có thể điều này sẽ không làm việc, nhưng nói rằng bạn có một mô-đun xử lý Pygame khởi tạo và nhà nước. Bạn có thể khởi tạo nó một lần, trong main và nhập nó bất cứ nơi nào bạn muốn.

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