2010-08-16 37 views
11

Tôi đang nhận được một chút đau đầu cố gắng tìm ra cách tổ chức các mô-đun và các lớp với nhau. Đến từ C++, tôi đã quen với các lớp học đóng gói tất cả các dữ liệu và các phương thức cần thiết để xử lý dữ liệu đó. Tuy nhiên, trong python có các mô-đun và từ mã tôi đã xem xét, một số người có rất nhiều chức năng lỏng lẻo được lưu trữ trong các mô-đun, trong khi các hàm khác hầu như luôn ràng buộc các hàm của chúng với các lớp như các phương thức.tổ chức các lớp học và mô-đun trong python

Ví dụ: tôi có cấu trúc dữ liệu và muốn ghi nó vào đĩa.

Một cách sẽ được thực hiện một phương pháp tiết kiệm cho đối tượng đó vì vậy mà tôi chỉ có thể gõ

MyObject.save(filename) 

hoặc một cái gì đó như thế. Một phương pháp tôi đã thấy trong tỷ lệ tương đương là phải có cái gì đó như

from myutils import readwrite 

readwrite.save(MyObject,filename) 

Đây là một ví dụ nhỏ, và tôi không chắc chắn như thế nào trăn cụ thể vấn đề này là gì cả, nhưng câu hỏi chung của tôi là những gì tốt nhất là thực hành pythonic về chức năng so với tổ chức phương pháp?

Trả lời

13

Có vẻ như các chức năng lỏng lẻo làm phiền bạn. Đây là cách python. Nó có ý nghĩa bởi vì một mô-đun trong python thực sự chỉ là một đối tượng trên cùng một chân như bất kỳ đối tượng khác. Nó có hỗ trợ mức độ ngôn ngữ để tải nó từ một tập tin nhưng khác hơn thế, nó chỉ là một đối tượng.

vì vậy nếu tôi có một mô-đun foo.py:

import pprint 

def show(obj): 
    pprint(obj) 

Sau đó, khi tôi nhập nó từ bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

Tôi chủ yếu truy cập vào một phương pháp trên đối tượng foo. Các thuộc tính dữ liệu của mô-đun foo chỉ là các hình cầu được xác định trong foo. Một mô-đun là việc thực hiện cấp độ ngôn ngữ của một singleton mà không cần phải thêm self vào mọi danh sách đối số phương thức.

Tôi cố gắng viết càng nhiều hàm cấp mô-đun càng tốt. Nếu một số chức năng sẽ chỉ làm việc với một thể hiện của một lớp cụ thể, tôi sẽ làm cho nó một phương thức trên lớp. Nếu không, tôi cố gắng làm cho nó hoạt động trên các cá thể của mọi lớp được định nghĩa trong mô-đun mà nó sẽ có ý nghĩa.

Lý do đằng sau ví dụ chính xác mà bạn đưa ra là nếu mỗi lớp có phương thức lưu, sau đó nếu bạn thay đổi cách lưu dữ liệu (từ hệ thống tệp sang cơ sở dữ liệu hoặc tệp XML từ xa) thì bạn phải thay đổi mọi lớp học. Nếu mỗi lớp thực hiện một giao diện để sinh ra dữ liệu mà nó muốn lưu, thì bạn có thể viết một hàm để lưu các cá thể của mỗi lớp và chỉ thay đổi hàm đó một lần. Điều này được gọi là Nguyên tắc trách nhiệm duy nhất: Mỗi lớp chỉ nên có một lý do để thay đổi.

3

Nếu bạn có một lớp học cũ thông thường bạn muốn lưu vào đĩa, tôi sẽ chỉ làm cho nó một phương pháp thể hiện. Nếu nó là một thư viện serialization có thể xử lý các loại đối tượng khác nhau, tôi sẽ làm theo cách thứ hai.

+2

Thuật ngữ "class method" có vẻ giống như 'classmethod', không áp dụng. Điều thích hợp sẽ được gọi là "phương thức" hoặc "phương pháp thể hiện". –

+0

Vâng, bạn nói đúng. Tôi có nghĩa là một phương pháp dụ. –

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