2010-06-11 33 views
10

Tôi đang học Python và tôi đã chơi với các gói. Tôi muốn biết cách tốt nhất để định nghĩa các lớp trong các gói. Dường như cách duy nhất để định nghĩa các lớp trong một gói là định nghĩa chúng trong gói __init__.py của gói đó. Đến từ Java, tôi muốn định nghĩa các tệp riêng lẻ cho các lớp của mình. Đây có phải là phương pháp được khuyến nghị không?Xác định các lớp học trong các gói

Tôi muốn có thư mục của tôi trông hơi như thế này:

recursor/ 
    __init__.py 
    RecursionException.py 
    RecursionResult.py 
    Recursor.py 

Vì vậy, tôi có thể tham khảo các lớp học của tôi như recursor.Recursor, recursor.RecursionException, và recursor.RecursionResult. Điều này có thể thực hiện được hoặc được đề xuất bằng Python không?

+4

Bắt buộc: [Python không phải là Java] (http://dirtsimple.org/2004/12/python-is-not-java.html) – voyager

+0

Ngoài ra, hãy kiểm tra http://stackoverflow.com/questions/2339371/ as-a-java-programmer-learning-python-những gì-nên-i-look-out-cho – froadie

+2

Có bạn có thể, nhưng không có bạn không nên. –

Trả lời

8

Hãy tiếp tục và xác định các lớp học của bạn trong các mô-đun riêng biệt. Sau đó hãy chắc __init__.py làm điều gì đó như thế này:

from RecursionException import RecursionException 
from RecursionResult import RecursionResult 
from Recursor import Recursor 

Đó sẽ nhập khẩu mỗi lớp thành namespace gốc của gói, do đó, mã gọi có thể tham khảo recursor.Recursor thay vì recursor.Recursor.Recursor.

Tôi cảm thấy cần phải thu lại một số nhận xét khác ở đây, mặc dù: Python không phải là Java. Thay vì tạo một mô-đun mới cho mọi lớp dưới ánh nắng mặt trời, tôi khuyên bạn nên nhóm các lớp liên quan chặt chẽ thành một mô-đun duy nhất. Việc hiểu mã của bạn dễ dàng hơn theo cách đó và mã gọi điện sẽ không cần nhập một tỷ lệ.

+4

Mặc dù 'recursor.Recursor.Recursor' không có sự quyến rũ nhất định với nó. – Ricky

2

Điều này hoàn toàn có thể thực hiện được. Chỉ cần tạo một mô-đun lớp mới cho từng lớp đó và tạo chính xác cấu trúc bạn đã đăng.

Bạn cũng có thể tạo mô-đun Recursion.py hoặc mô-đun tương tự và bao gồm tất cả 3 lớp trong tệp đó.

(Tôi cũng mới để Python từ Java, và tôi chưa đặt bất cứ điều gì trong __init__.py tác phẩm của tôi ...)

+0

Nếu tôi tạo bố cục thư mục ở trên, hãy định nghĩa lớp Recursor của tôi trong tệp Recursor.py và tôi cố gắng nhập "recursor.Recursor", tôi nhận được một ImportError. Tôi đang làm gì sai? –

+0

@rfkrocktk - bạn có thể phải chỉ định recursor.Recursor.Recursor ... đầu tiên cho gói, gói thứ hai cho tệp (tệp) và thứ ba cho lớp thực tế ... (Đôi khi tốt hơn nên cân nhắc sử dụng mô-đun phân loại như các gói ... thay vì một gói phần mềm recursor với 3 lớp như các tệp riêng biệt, bạn có thể có một mô-đun recursor với 3 lớp bên trong nó) – froadie

1

Trong Python bạn không bị hạn chế để xác định 1 lớp cho mỗi tập tin và vài làm việc đó đi. Bạn có thể nếu bạn muốn mặc dù - nó hoàn toàn tùy thuộc vào bạn. Gói trong Python chỉ là một thư mục có một tệp là

__init__.py 

. Bạn không cần phải đặt bất kỳ thứ gì trong tệp đó mà bạn có thể kiểm soát nội dung được nhập, v.v.

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