2014-04-23 11 views
21

我有一個類,我想要得到的目標早在一本字典,讓我實現了這個在__dict__()。它是否正確?重載__dict __()在Python類

我想了一次,我可以使用dict(自定義對象),並返回對象作爲字典,但這是行不通的。

你應該重載__dict__()?你如何使它可以使用dict()將自定義對象轉換爲字典?

回答

23

__dict__不是 Python對象的一種特殊方法。它用於屬性字典; dict()從來沒有使用它。

相反,你可以支持迭代;當dict()通過產生鍵值對的iterable時,產生具有這些鍵值對的新字典對象。

您可以通過實施__iter__方法來提供迭代,該方法應返回iterator。實施該方法作爲發電機的功能就足夠了:

class Foo(object): 
    def __init__(self, *values): 
     self.some_sequence = values 

    def __iter__(self): 
     for key in self.some_sequence: 
      yield (key, 'Value for {}'.format(key)) 

演示:

>>> class Foo(object): 
...  def __init__(self, *values): 
...   self.some_sequence = values 
...  def __iter__(self): 
...   for key in self.some_sequence: 
...    yield (key, 'Value for {}'.format(key)) 
... 
>>> f = Foo('bar', 'baz', 'eggs', 'ham') 
>>> dict(f) 
{'baz': 'Value for baz', 'eggs': 'Value for eggs', 'bar': 'Value for bar', 'ham': 'Value for ham'} 

你也可以繼承dict,或實現Mapping abstract class,並且dict()要麼承認並在複製鍵和值到一個新的字典對象。這是一個更多的工作,但如果你希望你的自定義類在其他地方也能像映射那樣工作,那麼這可能是值得的。

+0

似乎是合乎邏輯的,所以如果你想通過一組選定的信息回__iter__你能使用return {「VAR1」:「VAL1」,......「的Varn」:「VALN」},而不是屈服? –

+0

@ josh1234:不,'__iter__' *必須*返回一個迭代器;字典本身不是迭代器。 –

+0

@ josh1234:您需要生成一系列鍵值對。所以'iter(somedictionary.items())'很好,但不直接'somedictionary'。 –

22

__dict__是用於內省的方法 - 它返回對象的屬性。你想要的是一種全新的方法,例如稱爲as_dict - 這就是慣例。這裏要理解的是,dict對象不需要用dict構造函數創建。

+4

我比大多數人更喜歡這個答案。很高興知道'dict'是如何工作的,但是重寫'__iter__'從對象中獲得字典對我來說看起來有點不合理。它也可能有一些意想不到的後果。 –