在python中,如何將類對象轉換為dict

| | | | | | |

假設我在 python 中有一個簡單的類

class Wharrgarbl(object): def __init__(self, a, b, c, sum, version="old" ): self.a = a self.b = b self.c = c self.sum = 6 self.version = version def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

我可以很容易地將它轉換為整數

>>> w = Wharrgarbl("一", "二", "三", 6)>>> int(w) 9006 

太棒了!但是,現在我想以類似的方式將其轉換為字典

>>> w = Wharrgarbl("一", "二", "三", 6)>>> dict(w) {"a": "one", "c": "three", "b": "two"} 

我需要定義什麼才能使它工作?我嘗試用 __dict__dict 替換 __what_goes_here__,但 dict(w) 導致 TypeError : Wharrgarbl 對像在這兩種情況下都是不可迭代的。我認為簡單地使類可迭代並不能解決問題。我還嘗試了許多谷歌,使用盡可能多的不同措辭“python cast object to dict”,但找不到任何相關內容:{

還有!注意調用 w.__dict__ 不會做我想要的,因為它會包含 w.versionw.sum。我想自定義轉換為 dict 的方式與使用 def int(self) 自定義轉換為 int 的方式相同。

我知道我可以做這樣的事情

>>> w.__what_goes_here__() {"a": "one", "c": "three", "b": "two"} 

但我假設有一個 pythonic 方式使 dict(w) 工作,因為它與 int(w)str(w) 是同一類型的東西。如果有“更多的 Pythonic 方式,那也很好,只是想我會問。哦!我想既然它很重要,這適用於 python 2.7,但對於 2.4 舊的和失敗的解決方案來說也是超級加分。

還有一個問題Overloading __dict__() on python class這與這個相似,但可能有足夠的不同以保證這不是重複的。我相信 OP 正在詢問如何將他的類對像中的所有數據轉換為字典。我正在尋找一種更定制的方法,因為我不希望 __dict__ 中的所有內容都包含在 dict() 返回的字典中。諸如公共變量和私有變量之類的東西可能足以解釋我在尋找什麼。這些對象將存儲一些在計算中使用的值,因此我不需要/不想出現在結果字典中。

更新:我選擇使用 asdict 路線建議,但選擇我想成為問題的答案是一個艱難的選擇。 @RickTeachey 和 @jpmc26 都提供了我將要使用的答案,但前者有更多的信息和選項,並且也獲得了相同的結果,並且得到了更多的支持,所以我接受了它。儘管大家都支持並感謝幫助。我在 stackoverflow 上潛伏了很長時間,我正試圖讓我的腳趾更多地進入水中。