2013-04-25 42 views
6

Tôi đã sử dụng các lớp được sử dụng để lấy dữ liệu từ một hệ thống, thực hiện một số sửa đổi và sau đó xuất chúng vào một hệ thống khác. Mà thường đi theo cách chuyển đổi nó thành một dict hoặc một list sau khi tôi đã thực hiện tất cả các chuyển đổi cần thiết.Trình bày một lớp như một dict hoặc danh sách

Cho đến nay những gì tôi đã làm là tôi đã thực hiện hai phương pháp được gọi là as_dict()as_list() và sử dụng bất cứ khi nào tôi cần đại diện đó.

Nhưng tôi rất tò mò nếu có cách nào để có thể thực hiện dict(instance_of_my_class) hoặc list(instance_of_my_class).

Tôi đã đọc lên trên magic methods và dường như điều này là không thể?

Và một số mẫu mã đơn giản để làm việc với:

class Cost(object): 
    @property 
    def a_metric(self): 
     return self.raw_data.get('a_metric', 0) * 0.8 

    [..] 
    # Repeat for various kinds of transformations 

    def as_dict(self): 
     return { 
      'a_metric': self.a_metric, 
      [...] 
     } 
+0

tại sao bạn cần chuyển lớp học thành từ điển/danh sách? mỗi lớp có một __dict__ được xây dựng, đó là nơi các thuộc tính lớp được lưu trữ trong nội bộ, có thể nó là đủ để chỉ lưu trữ nó. – theAlse

+1

Có 'vars()' được xây dựng trong đó là cơ bản giống như 'obj .__ dict__'. – gatto

+0

@theAlse chủ yếu để chuyển đổi nó cho các bản cập nhật trong cơ sở dữ liệu hoặc để chuyển đổi đơn giản thành json – gaqzi

Trả lời

7

Bạn có nghĩa là một cái gì đó như thế này? Nếu vậy bạn phải xác định một phương pháp __iter__ rằng cặp khóa-giá trị sản lượng của:

In [1]: class A(object): 
    ...:  def __init__(self): 
    ...:  self.pairs = ((1,2),(2,3)) 
    ...:  def __iter__(self): 
    ...:   return iter(self.pairs) 
    ...:  

In [2]: a = A() 

In [3]: dict(a) 
Out[3]: {1: 2, 2: 3} 

Ngoài ra, có vẻ như dict cố gắng để gọi các phương pháp .keys/__getitem__ trước __iter__, vì vậy bạn có thể làm cho list(instance)dict(instance) trả lại một cái gì đó hoàn toàn khác.

In [4]: class B(object): 
    ...:  def __init__(self): 
    ...:  self.d = {'key':'value'} 
    ...:  self.l = [1,2,3,4] 
    ...:  def keys(self): 
    ...:   return self.d.keys() 
    ...:  def __getitem__(self, item): 
    ...:   return self.d[item] 
    ...:  def __iter__(self):   
    ...:   return iter(self.l) 
    ...:  

In [5]: b = B() 

In [6]: list(b) 
Out[6]: [1, 2, 3, 4] 

In [7]: dict(b) 
Out[7]: {'key': 'value'} 
+0

Công trình này thật tuyệt vời, cảm ơn! – gaqzi

+0

@gaqzi - Dường như 'dict' cố gắng gọi' .keys' trước khi gọi '__iter__' để bạn có thể tạo' list (instance) 'và' dict (instance) 'trả về một cái gì đó hoàn toàn khác nếu bạn cần :) – root

+0

Tuyệt vời !! : D Cảm ơn vì điều này. Im phát triển một cấu trúc của các thư viện cơ sở dữ liệu khác nhau (các lớp) kế thừa từ một lớp trừu tượng Cơ sở dữ liệu có nhận bản đồ để cấu hình và xác thực. –

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