Python’da, bir sınıf nesnesini bir dikteye nasıl atarım?

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

Diyelim ki python'da basit bir sınıfım var

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 = sürüm def __int__(self): dönüş self.sum + 9000 def __what_goes_here__(self): dönüş {"a" : self.a, "b": self.b, "c": self.c} 

Bunu bir tamsayıya çok kolay çevirebilirim

>>> w = Wharrgarbl("bir", "iki", "üç", 6) >>> int(w) 9006 

Bu harika! Ama şimdi onu benzer bir şekilde bir dikteye dönüştürmek istiyorum

>>> w = Wharrgarbl("bir", "iki", "üç", 6) >>> dict(w) {"a": "bir", "c": "üç", "b": "iki"} 

Bunun çalışması için neyi tanımlamam gerekiyor ? __what_goes_here__ yerine hem __dict__ hem de dict kullanmayı denedim, ancak dict(w) bir TypeError ile sonuçlandı : Her iki durumda da Wharrgarbl nesnesi yinelenemez. Sınıfı tekrarlanabilir hale getirmenin sorunu çözeceğini düşünmüyorum. Ayrıca "python cast object to dict" ifadesinin düşünebildiğim kadar çok farklı ifadesiyle birçok google'ı denedim ama alakalı bir şey bulamadım:{

Ayrıca! w.__dict__ çağrısının, w.version ve w.sum içereceği için istediğimi yapmayacağına dikkat edin. Alımı, def int(self) kullanarak int olarak özelleştirebildiğim şekilde dict olarak özelleştirmek istiyorum.

Böyle bir şey yapabileceğimi biliyorum

>>> w.__what_goes_here__() {"a": "bir", "c": "üç", "b": "iki"} 

Ancak Pythonic bir yol olduğunu varsayıyorum int(w) veya str(w) ile aynı türde olduğundan, dict(w) işlevini yapmak için. Daha Pythonic bir yol varsa, bu da sorun değil, sadece sorayım dedim. Ah! Sanırım önemli olduğu için, bu python 2.7 için, ancak 2.4 eski ve bozuk bir çözüm için de süper bonus puanlar.

Başka bir soru var python sınıfında __dict__() aşırı yükleme buna benzer, ancak bunun bir kopya olmadığını garanti edecek kadar farklı olabilir. OP'nin sınıf nesnelerindeki tüm verilerin sözlük olarak nasıl yayınlanacağını sorduğuna inanıyorum. dict() tarafından döndürülen sözlükte bulunan __dict__ içindeki her şeyin olmasını istemiyorum. Genel ve özel değişkenler gibi bir şey aradığımı açıklamak için yeterli olabilir. Nesneler, hesaplamalarda kullanılan bazı değerleri depolayacak ve sonuçta ortaya çıkan sözlüklerde görünmeye ihtiyacım yok/istemiyorum.

GÜNCELLEME: asdict rota önerildi ancak sorunun cevabı olmak istediğim şeyi seçmek zor bir seçimdi. Hem @RickTeachy hem de @jpmc26, birlikte kullanacağım cevabı verdi, ancak birincisi daha fazla bilgi ve seçeneğe sahipti ve aynı sonuca vardı ve daha fazla oy aldı, ben de onunla gittim. yardım edin. Stackoverflow'ta uzun süre pusuya yattım ve ayak parmaklarımı suya daha fazla sokmaya çalışıyorum.