2016-04-11 14 views
6

Tôi có một dự án python3.5 mà tôi quyết định tạo một lớp cho mỗi học phần. Tôi quyết định làm như vậy bởi vì tôi phát hiện ra các tệp của tôi rất dài và tôi rất khó hiểu những gì đang diễn ra.Làm thế nào để nhóm các mô-đun mutliple thành một không gian tên duy nhất?

Sau khi tôi thực hiện thay đổi tôi cảm thấy như tôi đang lặp lại bản thân mình trong mỗi tập tin nhập khẩu:

from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

Có cách nào vượt qua lặp lại điều đó không? Tôi muốn rằng hàng nhập khẩu của tôi sẽ giống như:

from school import Student, ClassRoom, Teacher 
+3

"mà tôi quyết định thực hiện một lớp cho mỗi mô-đun" - tại sao? Đây không phải là Java; bạn không cần phải làm điều đó. – user2357112

+2

Tại sao một lớp cho mỗi mô-đun trong trường hợp này? Không phải tất cả các mô hình của cùng một tên miền? Có lẽ họ thuộc về nhau? – fips

+0

Ông nói rằng ông đã làm nó cho dễ đọc, đó là một động lực rất hợp lý. – fgblomqvist

Trả lời

6

Sử dụng mô-đun __init__ để thực hiện việc này. Nội dung của mô-đun __init__ được đánh giá khi mô-đun/gói chính được nhập. Như thế này:

# __init__.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

này mang Student, ClassRoomTeacher vào namespace school. Bây giờ bạn có thể nhập bằng cách sử dụng mô-đun school tùy thích.

Thận trọng: nó thực sự dễ dàng gây ô nhiễm không gian tên của bạn theo cách này. Có thể tốt hơn là nhập rõ ràng trong từng mô-đun theo cách bạn bắt đầu hoặc sử dụng cách tiếp cận trong this answer và sử dụng các lớp của bạn sử dụng tham chiếu mô-đun rõ ràng (ví dụ: school.Teacher() thay vì Teacher()).

Nếu bạn cảm thấy school.Teacher() quá dài, bạn có thể rút ngắn mọi thứ lên một chút theo cách này:

import school as sch 
teacher = sch.Teacher() 

vv vv

Tuy nhiên, mặt khác, nếu những lớp học là đối tượng mà nên có sẵn ở cấp gói, việc nhập chúng vào không gian tên gói có thể là điều đúng để thực hiện. Chỉ bạn mới có thể đưa ra quyết định đó.

0

Có, bạn có thể. Chỉ cần đặt tất cả các lớp trong mô-đun school.py. Đó là những gì Python mô-đun dành cho. Những gì bạn chỉ cho chúng tôi thấy là cách Java (có thể) duy trì không gian tên thông qua các gói. Nếu bạn vẫn muốn đi theo con đường mà sau đó chỉ cần thực hiện một Moule all.py và viết,

# all.py 
from school.student import Student 
from school.classroom import ClassRoom 
from school.teacher import Teacher 

và bạn tập tin chính, viết from school.all import Student, ClassRoom, Teacher Nhưng bạn có thể thấy đó là dư thừa và xấu xí.

5

Tôi giả định school là một gói, nếu không bạn cần tạo gói và đặt tất cả các mô-đun của mình vào gói, sau đó tạo tệp __init__.py nơi bạn về cơ bản dán mọi thứ lại với nhau. Bạn cần phải sử dụng nhập tương đối trong tệp __init__.py của mình.

Bạn gói bây giờ phải trông như thế này:

school/ 
__init__.py 
student.py 
classroom.py 
teacher.py 

Sau đó, bạn __init__.py phải trông như thế này:

from .student import Students 
from .classroom import ClassRoom 
from .teacher import Teacher 

Tiếp theo chỉ gọi lớp học của bạn sử dụng tên gói như thế này:

import school 
t = school.Teacher() 
Các vấn đề liên quan