我有一個類,我想要得到的目標早在一本字典,讓我實現了這個在__dict__()
。它是否正確?重載__dict __()在Python類
我想了一次,我可以使用dict
(自定義對象),並返回對象作爲字典,但這是行不通的。
你應該重載__dict__()
?你如何使它可以使用dict()
將自定義對象轉換爲字典?
我有一個類,我想要得到的目標早在一本字典,讓我實現了這個在__dict__()
。它是否正確?重載__dict __()在Python類
我想了一次,我可以使用dict
(自定義對象),並返回對象作爲字典,但這是行不通的。
你應該重載__dict__()
?你如何使它可以使用dict()
將自定義對象轉換爲字典?
__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()
要麼承認並在複製鍵和值到一個新的字典對象。這是一個更多的工作,但如果你希望你的自定義類在其他地方也能像映射那樣工作,那麼這可能是值得的。
號__dict__
是用於內省的方法 - 它返回對象的屬性。你想要的是一種全新的方法,例如稱爲as_dict
- 這就是慣例。這裏要理解的是,dict
對象不需要用dict
構造函數創建。
我比大多數人更喜歡這個答案。很高興知道'dict'是如何工作的,但是重寫'__iter__'從對象中獲得字典對我來說看起來有點不合理。它也可能有一些意想不到的後果。 –
似乎是合乎邏輯的,所以如果你想通過一組選定的信息回__iter__你能使用return {「VAR1」:「VAL1」,......「的Varn」:「VALN」},而不是屈服? –
@ josh1234:不,'__iter__' *必須*返回一個迭代器;字典本身不是迭代器。 –
@ josh1234:您需要生成一系列鍵值對。所以'iter(somedictionary.items())'很好,但不直接'somedictionary'。 –