2010-08-26 17 views
18

Tôi đang sắp xếp một loạt các nội dung liên quan vào một lớp học. Mục đích chính là tổ chức chúng thành một không gian tên.Có nên sử dụng lớp làm không gian tên trong Python

class Direction: 

    north = 0 
    east = 1 
    south = 2 
    west = 3 

    @staticmethod 
    def turn_right(d): 
    return turn_to_the_right 

    @staticmethod 
    def turn_left(d): 
    return turn_to_the_left 



# defined a short alias because direction will be used a lot 
D = Direction 

d0 = D.north 
d1 = D.turn_right(d) 

Không có nhiều khái niệm đối tượng liên quan. Trong C++, tôi sẽ sử dụng từ khóa ngôn ngữ thực tế namespace. Không có điều như vậy trong Python. Vì vậy, tôi đang cố gắng sử dụng class cho mục đích này.

Đây có phải là một ý tưởng hay không? Bất kỳ pitfall với phương pháp này?

Tôi vừa trả lời câu hỏi liên quan hôm qua. Câu hỏi này được hỏi theo một cách khác. Đó là một quyết định thực sự tôi cần phải tự mình làm.

phương pháp tĩnh vs chức năng mô-đun trong python - Stack Overflow

Static method vs module function in python

+0

Cảm ơn bạn. Cho đến nay nhận xét tôi nhận được là 1. Sử dụng mô-đun 2. Làm điều gì có ý nghĩa. Những gì tôi vẫn muốn tìm ra là nếu lớp được coi là một lựa chọn hợp pháp cho chỉ đơn giản là sử dụng như không gian tên hoặc nếu có một số lý do chính đáng không. –

Trả lời

14

số Stick nó trong một module để thay thế.

Python không có không gian tên giống như cách mà C++ làm, nhưng mô-đun phục vụ một mục đích tương tự (có nghĩa là nhóm các lớp và chức năng giống nhau) và đặt tên duy nhất để tránh xung đột).

Chỉnh sửa
Tôi đã xem nhận xét bạn đã đăng lên câu hỏi của mình. Để trả lời rõ ràng hơn, không, trong mã Pythonic nó không thực sự chính xác để sử dụng một lớp để mô phỏng một không gian tên. Các mô-đun ở đó để nhóm các lớp, hàm và biến có liên quan - sử dụng mô-đun thay thế. Một lớp đại diện cho một "điều" có một hành vi (các phương thức) và dữ liệu (các biến mẫu) - nó không chỉ là một tập hợp các hàm và biến độc lập.

+2

Có biện minh mạnh hơn cho mô-đun không? Tôi có thể nghĩ ra một tùy chọn để thực hiện 'từ hướng nhập *. Mặt khác, nếu chỉ có 4 hằng số "bắc, đông, nam, tây", có vẻ như quá mức cần thiết để đưa chúng vào mô-đun riêng của chúng. –

+1

Bạn nên đặt chúng ở nơi chúng có ý nghĩa, từ quan điểm của tổ chức. Nếu họ "đi cùng" với một mô-đun hiện có, hãy đặt chúng ở đó (bạn có thể đổi tên chúng thành 'DIRECTION_NORTH' hoặc bất kỳ thứ gì). Nếu không, hãy đặt chúng trong một mô-đun riêng biệt, nếu điều đó có ý nghĩa. – mipadi

+0

Lý do cơ bản của bạn để sử dụng một lớp thay vì một mô-đun cho việc sắp xếp không gian tên từ chối những phẩm chất thực sự mà cả hai thứ đều chia sẻ bằng Python. Nhiều hơn so với khác nhau. – uchuugaka

2

Có, không sao. Bạn thậm chí có thể sử dụng property để làm cho các phương thức trông giống như thuộc tính.

Nếu bạn có một lớp học lớn, có thể cần sử dụng mô-đun

2

Tùy theo tình huống; nếu bạn có thể gắn một hằng số vào mô-đun và làm cho nó có ý nghĩa, bằng mọi cách, nhưng đặt chúng trong lớp có thể làm cho ý nghĩa của chúng rõ ràng hơn và cho phép các hằng số tương tự có nhiều "trừu tượng" hơn: đặt chúng trong ServerError lớp học có ý nghĩa hơn so với việc tất cả chúng được prepended với SERVER_ERROR cư trú tự do trong mô-đun.

Làm những gì trực quan nhất, nhưng cố gắng tránh ô nhiễm không gian tên.

4

Có, thực sự. Bạn có thể sử dụng các lớp Python một cách nghiêm ngặt cho việc đặt tên không gian vì đó là một trong những điều đặc biệt mà chúng có thể làm và làm khác với các mô-đun. Việc xác định một lớp là một không gian tên nội tuyến trong một tệp dễ dàng hơn rất nhiều để tạo ra nhiều tệp hơn. Bạn không nên làm điều đó mà không bình luận mã của bạn nói rằng nó là gì. Các lớp học Python có nhiều hình thức và mục đích khác nhau và điều này làm cho khó hiểu mã mà bạn chưa từng thấy trước đây.

Một lớp Python được sử dụng như một vùng tên không kém lớp Python hơn là một lớp đáp ứng nhận thức về những gì một lớp là các ngôn ngữ khác. Python không yêu cầu một lớp được khởi tạo là hữu ích. Nó không yêu cầu ivars và không yêu cầu phương pháp. Nó khá linh hoạt.

Các giai đoạn cũng có thể chứa các lớp khác.

Rất nhiều người có ý tưởng về những gì là hoặc không phải là Pythonic. Nhưng nếu tất cả đều lo lắng về một thứ gì đó như sự nhất quán, họ sẽ đẩy những thứ như len()dir()help() là một phương thức của các đối tượng chứ không phải là chức năng toàn cầu.

Làm việc gì, nhận xét/ghi tài liệu nếu nó không phải là cách sử dụng thông thường hoặc rõ ràng.

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