2011-08-04 30 views
6

Điều này có thể đã được hỏi trước nhưng tôi không thể tìm thấy câu trả lời cho câu hỏi cụ thể của tôi (khá chung ...)Cách sắp xếp đúng định nghĩa lớp Python đối với tệp trợ giúp cho lớp đó?

Dưới đây là ví dụ về câu hỏi của tôi. Nói rằng gói của tôi được gọi là 'school', và tôi có một lớp được gọi là 'book' sẽ có các tệp .py cùng với nó chứa thịt của các phương thức của nó. Tôi không chắc chắn làm thế nào để tổ chức tất cả để báo cáo nhập khẩu không nhìn lạ.

Làm cách nào để sắp xếp tệp?

/school/ 
     pencil/ 
     book/ 
      __init__.py 
      read.py 
      burn.py 
      book.py 

Tôi muốn để có thể làm điều gì đó như thế này, vì nó làm cho ý nghĩa nhất:

from school import Book 
b = Book(name="The Bible") 
b.read() 

Nhưng từ cấu trúc tập tin trên, tôi sẽ phải làm:

from school.book import Book 
b = Book(....etc 

HOẶC

from school import book 
b = book.Book(...etc 

T hese là khó xử/lặp đi lặp lại ... những gì tôi thiếu ở đây?

Trả lời

7

Bạn đang nhầm lẫn các gói với các lớp tôi nghĩ. Cá nhân, tôi sẽ đặt mọi định nghĩa lớp và tất cả các hàm có liên quan trực tiếp đến lớp đó trong cùng một tệp .py. Ví dụ, đọc không phải là một đối tượng, vì vậy tôi sẽ đặt nó như là một hàm trong lớp Book, không phải là tệp .py của riêng nó. Vì vậy, cấu trúc sẽ trông giống như thế này.

/school/ 
    pencil.py 
    book.py 

Bên book.py, bạn muốn có một cái gì đó như thế này

class Book(): 
    def __init__(self,name,author,isbn,your_variable_here): 
     #Your init method 

    def read(self,kid): 
     return "{0} is reading {1}.".format(kid,self.name) 

    def burn(self,library,lighter): 
     library.remove(self) 
     lighter.light(self) 
     return "Preparing to burn people." 

Sau đó, nhập khẩu của bạn trông như thế này.

from school import book 
    b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!') 
    b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere 
    b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier. 

Lợi thế này của hệ thống này là mô hình thực tế chặt chẽ hơn. Thay vì một loạt các chức năng đi kèm theo một cấu trúc tệp (như bạn đã lưu ý, có thể phức tạp), bạn đã nhóm các lớp đó thành các nhóm và cấu trúc lôgíc. Tuy nhiên, tôi cho rằng Học sinh nên có chức năng đọc và thư viện nên có chức năng thanh toán, để lại sách chỉ với chức năng ghi. Nhưng đó là vì sách không đọc, mọi người làm. Và các cuốn sách không kiểm tra, thư viện làm. Đó là câu hỏi về cách bạn muốn tổ chức nó.

+0

Cảm ơn bạn đã trả lời. Nhưng điều gì sẽ xảy ra nếu các phương thức read() và burn() của tôi là hàng trăm dòng và tôi không muốn book.py trở thành một mớ hỗn độn khổng lồ? – Ian

+1

Mỗi phương pháp là hàng trăm dòng? Thành thật mà nói, tôi sẽ cố gắng tìm cách để tái cấu trúc nên đó là một số hàm ngắn hơn. Đó không phải lúc nào cũng có thể, rõ ràng, nhưng tôi vẫn cố gắng. Lý tưởng nhất, bạn muốn mỗi chức năng làm một việc, và chỉ một điều, và bạn muốn nó phù hợp trên một trang 'duy nhất' (có thể là một trang được in hoặc một màn hình của trình soạn thảo mà không cần cuộn). Điều đó nói rằng, ngay cả khi tôi có một số chức năng dài vài trăm dòng, tôi vẫn đặt tất cả chúng trong cùng một lớp. Nó phù hợp với mô hình đối tượng của Python tốt hơn và dễ dàng hơn để tìm mọi thứ. – Jonathanb

+1

Sau đó, chúng có thể được chia thành các phần nhỏ hơn, để lại cho bạn toàn bộ các phương thức riêng nhỏ và các phương thức nhập công khai nhỏ đọc() và ghi() tổ chức công việc của các phương thức nhỏ hơn. Nhưng trong mọi trường hợp, tôi không đích thân thấy rằng một phương pháp phức tạp lớn là dễ hiểu hơn trong một tệp riêng biệt (cách xa mọi thứ khác mà nó đề cập đến trong lớp) hơn là trong tệp chính. – Ben

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