2012-06-19 39 views
29

Khi xem xét thiết kế, trong trường hợp nào thì sử dụng lớp so với dict là hợp lý? Ưu điểm & Nhược điểm cũng sẽ hữu ích.Khi nào sử dụng class so với dict trong python?

Ví dụ,

class AlbumState: 
    """ AlbumState class, tracks photos shown, etc""" 

    def __init__ (self, album): 
     """ album for this object will track state""" 
     self.album = album 

     self.photos_shown = [] 
     self.photos_notshown = range(album.size()) 

so

albumstate['album'] = album 
albumstate['photos_shown'] = [] 
albumstate['photos_notshown'] = range(album.size()) 
+0

Liên quan đến [Python: Tôi có nên sử dụng lớp học hoặc từ điển không?] (Http://stackoverflow.com/questions/4045161/python-should-i-use-a-class-or-dictionary) và [Chuyển đổi Python dict thành đối tượng?] (http://stackoverflow.com/questions/1305532/convert-python-dict-to-object) – ChaimG

Trả lời

27

tôi sẽ nói những tiêu chí đầu tiên và quan trọng nhất để phân biệt xem có nên sử dụng một lớp hay một cuốn từ điển là cho dù bạn chỉ muốn có một số dữ liệu lưu trữ hoặc bạn cũng muốn có một số logic (tức là, phương pháp).

Nếu bạn chỉ cần giữ lại nhiều dữ liệu, thì từ điển có thể là cách để đi. Mặt khác, nếu bạn cần các hoạt động được thực hiện trên dữ liệu đó, và có một mối quan hệ rất chặt chẽ giữa dữ liệu và các hoạt động (tạo thành một loại thực thể), thì thực sự yêu cầu sử dụng một lớp.

Khi @Ben đề xuất, bạn có thể bắt đầu sử dụng từ điển khi bạn có nhiều dữ liệu liên quan và nếu bạn nhận ra rằng bạn cũng cần một số logic cho dữ liệu đó, bạn có thể biến từ điển thành lớp học.

Bạn cũng có thể xem Unified Modeling Language (UML)class diagrams để có cảm giác tốt hơn về cách sử dụng lớp học. Nếu bạn đang thực hiện một số ứng dụng nhỏ hoặc lập trình một ứng dụng nhỏ, bạn có thể không cần sử dụng UML, nhưng nếu bạn đang thiết kế một hệ thống lớn hơn và phức tạp hơn, nó thực sự có thể giúp bạn quyết định bạn cần bao nhiêu lớp.

+1

Tôi chỉ thêm, bạn có thể dễ dàng lấy một dict và biến nó thành một lớp sau đó trên xuống dòng nếu nó quay ra bạn nghĩ rằng bạn chỉ muốn các hiệp hội dữ liệu, nhưng sau đó cần logic. Ngoài ra, hãy xem xét sử dụng defaultdict, vì có vẻ như nó sẽ hoạt động như thế nào bạn muốn hành vi của bạn hoạt động. – Ben

15

A dict có thể sử dụng bất kỳ giá trị có thể băm nào làm khóa, trong khi trường hợp class cần phải có chuỗi là mã định danh hợp pháp làm "khóa". Vì vậy, bạn có thể kết hợp dữ liệu tùy ý trong một số dict.

Đó là khá phổ biến để sử dụng một lớp tầm thường như một thuận tiện hơn dict khi giá trị quan trọng của bạn đều có chuỗi định danh hợp lệ anyway:

class Box: 
    pass 

x = Box() 

x.a = 0 
x.b = 1 

d = {} 
d["a"] = 0 # "x.a" is easier to type than this 
d["b"] = 1 

print("Current value for 'a' is: {}".format(x.a)) 

Ngay khi bạn bắt đầu làm đúng thiết kế hướng đối tượng, và bạn có các hàm phương thức đi cùng với dữ liệu, bạn muốn có dữ liệu trong một lớp thích hợp để bạn có thể gộp các hàm của phương thức. Đó là hợp pháp để chỉ có một dict và một số hàm toàn cầu hoạt động trên đó, nhưng nếu tất cả đều có liên quan, chỉ cần gộp chúng thành một class.

Và cuối cùng, lưu ý rằng dict là khối xây dựng được sử dụng để triển khai class. Nếu bạn lưu trữ các giá trị trong một lớp, chúng thực sự được lưu trữ bên trong một nội bộ dict và chỉ có một số cú pháp thuận tiện để truy cập chúng.

print(x.a) # prints 1 

print(x.__dict__["a"]) # does exact same thing as previous line 
+0

Câu trả lời hay. Đặc biệt là phần: "... và bạn có các hàm phương thức đi cùng với dữ liệu, bạn muốn có dữ liệu trong một lớp thích hợp để bạn có thể gộp các hàm phương thức vào.Đó là hợp pháp để chỉ có một dict và một số ít các chức năng toàn cầu hoạt động trên nó, nhưng nếu tất cả chúng đều liên quan, nó chỉ có ý nghĩa để kết hợp chúng thành một 'lớp'. Đó là một trong những điểm bán hàng chính của OOP : Kết hợp các phương thức và dữ liệu để chúng tôi không phải có các chức năng toàn cục hoạt động trên các biến mất. – Ugur

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