2010-07-28 36 views
31

Đôi khi nó có ý nghĩa với việc cụm dữ liệu liên quan với nhau. Tôi có xu hướng làm như vậy với một dict, ví dụ,Sử dụng lớp Python như một thùng chứa dữ liệu

self.group = dict(a=1, b=2, c=3) 
print self.group['a'] 

Một trong những đồng nghiệp của tôi thích để tạo ra một lớp

class groupClass(object): 
    def __init__(a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 
self.group = groupClass(1, 2, 3) 
print self.group.a 

Lưu ý rằng chúng tôi không xác định bất kỳ phương pháp lớp.

Tôi thích sử dụng dict vì tôi muốn giảm thiểu số dòng mã. Đồng nghiệp của tôi nghĩ rằng mã có thể đọc được nhiều hơn nếu bạn sử dụng một lớp, và nó giúp dễ dàng thêm các phương thức vào lớp trong tương lai.

Bạn thích điều gì và tại sao?

+1

đồng nghiệp của bạn phải là một lập trình viên mới. –

+0

nitpick nhỏ: bạn sẽ sử dụng 'print self.group ['a']' –

+3

@Jesse: Không, anh ấy không phải là lập trình viên mới (và anh ấy là một lập trình viên giỏi), nhưng anh ấy làm nhiều Java hơn Python nên anh ấy thích thêm nhiều của mã (getters, vv) mà tôi nghĩ là không cần thiết. Tôi cũng có thể không đại diện cho vị trí của anh ta tốt. –

Trả lời

32

Nếu bạn đang thực sự không bao giờ xác định bất kỳ phương pháp lớp, một dict hoặc một namedtuple có ý nghĩa hơn rất nhiều , theo ý kiến ​​của tôi. Đơn giản + nội trang là tốt! Để mỗi riêng của mình mặc dù.

+8

namedtuple's là tuyệt vời; chỉ cần nhớ họ không thay đổi được. Và đừng quên nếu bạn cần thêm các phương thức lớp sau, bạn luôn có thể kế thừa từ kết quả của namedtuple. Ví dụ. 'class Point (namedtuple ('Point', 'x y')): ...' –

+0

Câu trả lời tuyệt vời xung quanh. Tôi đã chọn cái này vì tôi thích gợi ý thử một tên có tên. –

+2

Ví dụ về cách sử dụng 'namedtuple' với mã OP có thể tốt đẹp. – tokland

8

Tôi thích theo dõi YAGNI và sử dụng dict.

+0

Tôi đồng ý, ngoại trừ việc tôi thực sự thích sự tiện lợi của quyền truy cập thuộc tính (như trong JavaScript), vì vậy tôi thích sử dụng [AttributeDict] (http://stackoverflow.com/questions/4984647/accessing-dict-keys-like- một thuộc tính-in-python). – voithos

1

Trong ngôn ngữ hỗ trợ, tôi sẽ sử dụng struct. Một từ điển sẽ là gần nhất với một cấu trúc trong Python, ít nhất là theo như tôi thấy nó.

Chưa kể, bạn có thể thêm một phương pháp để một cuốn từ điển nào nếu bạn thực sự muốn;)

2

Tôi không đồng ý rằng mã dễ đọc hơn khi sử dụng lớp học không có phương pháp. Bạn thường mong đợi chức năng từ một lớp, không chỉ dữ liệu.

Vì vậy, tôi muốn đi cho một dict cho đến khi nhu cầu về chức năng phát sinh, và sau đó các nhà xây dựng của lớp có thể nhận được một dict :-)

1

Một dict rõ ràng là phù hợp với hoàn cảnh đó. Nó được thiết kế đặc biệt cho trường hợp sử dụng đó. Trừ khi bạn thực sự sẽ sử dụng lớp như một lớp, không có sử dụng trong việc phát minh lại bánh xe và phát sinh thêm phí/lãng phí không gian của một lớp hoạt động như một từ điển xấu (không có tính năng từ điển).

4

Cách của bạn tốt hơn. Đừng cố gắng dự đoán tương lai quá nhiều vì bạn không có khả năng thành công.

Tuy nhiên, it may make sense sometimes to use something like a C struct, ví dụ: nếu bạn muốn xác định các loại khác nhau thay vì sử dụng dicts cho mọi thứ.

2

Bạn có thể kết hợp các ưu điểm của dict và lớp với nhau, sử dụng một số lớp trình bao bọc được kế thừa từ dict. Bạn không cần phải viết mã boilerplate, và đồng thời có thể sử dụng ký hiệu chấm.

class ObjDict(dict): 
    def __getattr__(self,attr): 
     return self[attr] 
    def __setattr__(self,attr,value): 
     self[attr]=value 

self.group = ObjDict(a=1, b=2, c=3) 
print self.group.a 
2

Có đề xuất mới nhằm thực hiện chính xác những gì bạn đang tìm kiếm, được gọi là data classes. Hãy nhìn vào nó.

Sử dụng lớp học trên dict là một vấn đề ưu tiên. Cá nhân tôi thích sử dụng một dict khi các phím không được biết đến là một ưu tiên. (Là vùng chứa bản đồ).

Sử dụng lớp để giữ dữ liệu có nghĩa là bạn có thể cung cấp tài liệu cho thuộc tính lớp.

Cá nhân, có lẽ lý do lớn nhất để tôi sử dụng một lớp học là sử dụng tính năng tự động hoàn thành IDE! (Về mặt kỹ thuật một lý do khập khiễng, nhưng rất hữu ích trong thực tế)

+0

Đề xuất hiện chính thức trong Python 3.7 –

3

nền

Một bản tóm tắt, hộp đựng dữ liệu thuộc tính dựa trên thay thế được trình bày bởi R. hettinger tại khách sạn Holiday 2017 meetup SF của Python. Xem số tweet và số slide deck của anh ấy.

Các loại thùng chứa dữ liệu khác được đề cập trong tài liệu này article và chủ yếu trong tài liệu Python 3 (xem các liên kết bên dưới).

Tùy chọn

Alternatives trong bộ thư viện chuẩn

tùy chọn External

  • records: mutable namedtuple
  • bunches: thêm truy cập thuộc tính để dicts (nguồn cảm hứng cho SimpleNamedspace)
  • box: quấn dicts với dot-style lookup chức năng

Mà một trong những?

Quyết định tùy chọn sử dụng tùy thuộc vào tình huống. Thông thường, một từ điển có thể thay đổi theo kiểu cũ hoặc có tên bất biến là đủ tốt. Các lớp dữ liệu là bổ sung mới nhất (Python 3.7a) cung cấp cả khả năng biến đổi và optional immutability, với lời hứa giảm bản đồ lò hơi như được lấy cảm hứng từ dự án attrs.

0

gì về Prodict:

class Person(Prodict): 
    name: str 
    email: str 
    rate: int 

john = Person(name='John', email='[email protected]') 
john.rate = 7 
john.age = 35 # dynamic 
Các vấn đề liên quan