En Python, ¿cómo puedo convertir un objeto de clase en un dictado?

| | | | | | |

Digamos que tengo una clase simple en python

class Wharrgarbl(objeto): def __init__(self, a, b, c, sum, version="old" ): self.a = a self.b = b self.c = c self.sum = 6 self.version = versión def __int__(self): return self.sum + 9000 def __what_va_aquí__(self): return {"a" : self.a, "b": self.b, "c": self.c} 

Puedo convertirlo a un número entero muy fácilmente

>>> w = Wharrgarbl("uno", "dos", "tres", 6) >>> int(w) 9006 

¡Qué genial! Pero, ahora quiero convertirlo en un dictado de manera similar

>>> w = Wharrgarbl("uno", "dos", "tres", 6) >>> dict(w) {"a": "uno", "c": "tres", "b": "dos"} 

¿Qué necesito definir para que esto funcione? ? Intenté sustituir __dict__ y dict por __what_goes_here__, pero dict(w) resultó en un TypeError : El objeto Wharrgarbl no es iterable en ambos casos. No creo que simplemente hacer que la clase sea iterable resuelva el problema. También intenté muchas búsquedas en Google con tantas expresiones diferentes de "Python cast object to dict" como se me ocurrió, pero no pude encontrar nada relevante:{

¡También! Observe cómo llamar a w.__dict__ no hará lo que quiero porque contendrá w.version y w.sum. Quiero personalizar la conversión a dict de la misma manera que puedo personalizar la conversión a int usando def int(self).

Sé que podría hacer algo como esto

>>> w.__what_goes_here__() {"a": "uno", "c": "tres", "b": "dos"} 

Pero asumo que hay una forma pitónica para hacer que dict(w) funcione ya que es el mismo tipo de cosa que int(w) o str(w). Si no hay una forma más pitónica, también está bien, solo pensé en preguntar. ¡Oh! Supongo que, dado que es importante, esto es para python 2.7, pero también puntos extra para una solución 2.4 vieja y rota.

Hay otra pregunta Sobrecargar __dict__() en la clase python que es similar a este pero puede ser lo suficientemente diferente como para garantizar que esto no sea un duplicado. Creo que OP está preguntando cómo convertir todos los datos en sus objetos de clase como diccionarios. Estoy buscando un enfoque más personalizado en el que yo no quiero que todo en __dict__ esté incluido en el diccionario devuelto por dict(). Algo así como variables públicas o privadas puede ser suficiente para explicar lo que estoy buscando. Los objetos almacenarán algunos valores utilizados en los cálculos y no necesito/no quiero que aparezcan en los diccionarios resultantes.

ACTUALIZACIÓN: he elegido ir con el asdict ruta sugerida, pero fue una elección difícil seleccionar lo que quería que fuera la respuesta a la pregunta. Tanto @RickTeachey como @jpmc26 dieron la respuesta que voy a seguir, pero el primero tenía más información y opciones y también obtuvo el mismo resultado y recibió más votos positivos, así que lo seguí. Sin embargo, hubo votos positivos y gracias por el ayuda. Estuve al acecho durante mucho tiempo en stackoverflow y estoy tratando de meter más los dedos de los pies en el agua.

Esperamos que este artículo le haya ayudado a resolver el problema. Además de En Python, ¿cómo puedo convertir un objeto de clase en un dictado?, consulta otros temas relacionados con __dict__.

¿Quiere sobresalir en Python? Consulte nuestra reseña de los mejores cursos en línea de Python 2022. Si está interesado en Data Science, consulte también cómo aprender programación en R.

Por cierto, este material también está disponible en otros idiomas:



Marie Robinson

Shanghai | 2022-11-29

Me estaba preparando para mi entrevista de codificación, gracias por aclarar esto - En Python, ¿cómo puedo convertir un objeto de clase en un dictado? en Python no es el más simple. Solo espero que eso no vuelva a surgir

Olivia Richtgofen

Abu Dhabi | 2022-11-29

__dict__ es todo un poco confuso 😭 En Python, ¿cómo puedo convertir un objeto de clase en un dictado? no es el único problema que encontré. Comprobado ayer, ¡funciona!

Dmitry Williams

Moscow | 2022-11-29

Sencillo y claro. Gracias por compartir. En Python, ¿cómo puedo convertir un objeto de clase en un dictado? y otros temas con exp siempre fue mi punto débil 😁.. Simplemente no estoy muy seguro de que sea el mejor método

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

Common xlabel/ylabel for matplotlib subplots

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

12 answers

NUMPYNUMPY

Flake8: Ignore specific warning for entire file

12 answers

NUMPYNUMPY

glob exclude pattern

12 answers

NUMPYNUMPY

How to avoid HTTP error 429 (Too Many Requests) python

12 answers

NUMPYNUMPY

Python CSV error: line contains NULL byte

12 answers

NUMPYNUMPY

csv.Error: iterator should return strings, not bytes

12 answers

News


Wiki

Python | How to copy data from one Excel sheet to another

Common xlabel/ylabel for matplotlib subplots

Check if one list is a subset of another in Python

sin

How to specify multiple return types using type-hints

exp

Printing words vertically in Python

exp

Python Extract words from a given string

Cyclic redundancy check in Python

Finding mean, median, mode in Python without libraries

cos

Python add suffix / add prefix to strings in a list

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

Python - Move item to the end of the list

Python - Print list vertically