Jak w Pythonie rzutować obiekt klasy na dykt?

| | | | | | | | | | | | | | | |

Powiedzmy, że mam prostą klasę w Pythonie

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 = wersja def __int__(self): return self.sum + 9000 def __what_goes_here__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Mogę bardzo łatwo rzutować na liczbę całkowitą

>>> w = Wharrgarbl("jeden", "dwa", "trzy", 6) >>> int(w) 9006 

Co jest świetne! Ale teraz chcę w podobny sposób wrzucić go na dykt.

>>> w = Wharrgarbl("jeden", "dwa", "trzy", 6) >>> dict(w) {"a": "jeden", "c": "trzy", "b": "dwa"} 

Co muszę zdefiniować, aby to zadziałało ? Próbowałem zamienić __dict__ i dict na __what_goes_here__, ale dict(w) spowodowało TypeError : Obiekt Wharrgarbl nie jest iterowalny w obu przypadkach. Nie sądzę, że samo iterowalność klasy rozwiąże problem. Próbowałem również wielu wyszukiwań Google z tyloma różnymi sformułowaniami „obszar rzucany w Pythonie do dyktowania”, ile tylko mogłem wymyślić, ale nie mogłem znaleźć niczego odpowiedniego :{

Również! Zauważ, że wywołanie w.__dict__ nie zrobi tego, czego chcę, ponieważ będzie zawierać w.version i w.sum. Chcę dostosować rzutowanie do dict w taki sam sposób, w jaki mogę dostosować rzutowanie do int za pomocą def int(self).

Wiem, że mógłbym po prostu zrobić coś takiego

>>> w.__what_goes_here__() {"a": "jeden", "c": "trzy", "b": "dwa"} 

Ale zakładam, że istnieje sposób w Pythonie aby dict(w) działał, ponieważ jest to ten sam typ rzeczy co int(w) lub str(w). Jeśli nie ma bardziej pytonowego sposobu, to też jest w porządku, po prostu pomyślałem, że zapytam. Och! Myślę, że skoro ma to znaczenie, dotyczy to Pythona 2.7, ale super punkty bonusowe również za stare i zepsute rozwiązanie 2.4.

Jest jeszcze jedno pytanie Przeciążanie __dict__() w klasie Pythona który jest podobny do tego, ale może być wystarczająco inny, aby zagwarantować, że nie jest to duplikat.Uważam, że OP pyta, jak rzucić wszystkie dane w swoich obiektach klasy jako słowniki.Szukam bardziej spersonalizowanego podejścia w tym nie chcę, aby wszystko w __dict__ było zawarte w słowniku zwróconym przez dict(). Coś w rodzaju zmiennych publicznych i prywatnych może wystarczyć do wyjaśnienia, czego szukam. Obiekty będą przechowywać niektóre wartości używane w obliczeniach i takie, że nie muszę/chcę pojawiać się w wynikowych słownikach.

AKTUALIZACJA: Zdecydowałem się na asdict trasa sugerowała, ale wybór tego, co chciałem być odpowiedzią na pytanie, był trudnym wyborem. Zarówno @RickTeachey, jak i @jpmc26 dostarczyli odpowiedź, z którą zamierzam się toczyć, ale ten pierwszy miał więcej informacji i opcji, wylądował na tym samym wyniku i został bardziej przegłosowany, więc poszedłem z tym. pomocy. Długo i ciężko czaiłem się na stackoverflow i staram się bardziej zanurzyć palce u stóp w wodzie.