假設我在 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.version
和 w.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 上潛伏了很長時間,我正試圖讓我的腳趾更多地進入水中。