Explicar el atributo __dict__ en Python

4 minutos de lectura

Avatar de usuario de Zakos
Zakos

Estoy realmente confundido acerca de la __dict__ atributo. He buscado mucho, pero todavía no estoy seguro acerca de la salida.

¿Alguien podría explicar el uso de este atributo desde cero, en los casos en que se usa en un objeto, una clase o una función?

  • Deberías leer esto: docs.python.org/2/reference/datamodel.html

    –Henrik Andersson

    11 de noviembre de 2013 a las 13:23

  • Nadie podrá aliviar su confusión si no entendemos por qué está confundido. Si trató de explicar eso, es posible que tenga una pregunta sobre el tema para el sitio.

    –Jon Clements

    11 de noviembre de 2013 a las 13:24

  • Para evitar la duplicación, esta pregunta podría ampliarse para preguntar cómo dictar obras de conversión.

    – Sajuuk

    10 de mayo de 2019 a las 2:39

  • Esta versión de la pregunta es claramente mejor que con la que se cerró antes. He invertido la dirección del cierre duplicado.

    – Karl Knechtel

    13 de agosto a las 9:23

avatar de usuario de thefourtheye
los cuatro ojos

Básicamente contiene todos los atributos que describen el objeto en cuestión. Se puede utilizar para modificar o leer los atributos. citando de la documentación para __dict__

Un diccionario u otro objeto de mapeo utilizado para almacenar los atributos (de escritura) de un objeto.

Recuerda, todo es un objeto en Python. Cuando digo todo, me refiero a todo, como funciones, clases, objetos, etc. (Ya leyeron bien, clases. Las clases también son objetos). Por ejemplo:

def func():
    pass

func.temp = 1

print(func.__dict__)

class TempClass:
    a = 1
    def temp_function(self):
        pass

print(TempClass.__dict__)

dará salida

{'temp': 1}
{'__module__': '__main__', 
 'a': 1, 
 'temp_function': <function TempClass.temp_function at 0x10a3a2950>, 
 '__dict__': <attribute '__dict__' of 'TempClass' objects>, 
 '__weakref__': <attribute '__weakref__' of 'TempClass' objects>, 
 '__doc__': None}

  • Hola, si en la definición de func estaba la declaración z=10, ¿por qué en la salida de func.__dict__ veo {}? Digamos que la instrucción func.temp=1 existió a continuación.

    – Zakos

    11 de noviembre de 2013 a las 13:39

  • @Zakos __dict__ contendrá atributos que describen el objeto. Para una clase, las variables dentro de ella definen la clase, pero para una función, no lo es.

    – los cuatro ojos

    11 de noviembre de 2013 a las 13:42

  • dictar no imprimirá ‘a’: 1 ya que no está configurado en el en eso método

    – rotemx

    14 de enero de 2019 a las 13:19

  • @rotemx No estamos hablando de variables miembro aquí. si ves el print estado de cuenta, estamos imprimiendo el __dict__ de la clase en sí, no una instancia de ella.

    – los cuatro ojos

    16 de enero de 2019 a las 3:37

  • Intenté esto en un tipo de datos predeterminado en Python y falló AttribueErroralguna razón para esto.

    – Krishna Ozá

    3 de mayo de 2020 a las 5:32

Kai - Avatar de usuario de Kazuya Ito
Kai-Kazuya Ito

__dict__ puede obtener las variables de instancia (atributos de datos) en un objeto como un diccionario.

Entonces, si hay Person clase a continuación:

class Person:
    x1 = "Hello"
    x2 = "World"
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def test1(self):
        print("Test1")

    def test2(self):
        print("Test2")
    
    @staticmethod
    def test3():
        print("Test3")

    @staticmethod
    def test4():
        print("Test4")

person = Person("John", 27)    
print(person.__dict__) # Here

__dict__ obtiene name y age con sus valores en un diccionario como se muestra a continuación:

{'name': 'John', 'age': 27}

Y si la nueva variable de instancia gender se agrega después de la instanciación como se muestra a continuación:

# ...

person = Person("John", 27)
person.gender = "Male" # Here  
print(person.__dict__)

__dict__ obtiene name, age y gender con sus valores en un diccionario como se muestra a continuación:

{'name': 'John', 'age': 27, 'gender': 'Male'}

Además, si se usa directorio() Como se muestra abajo:

# ...

person = Person("John", 27)
person.gender = "Male" 
print(dir(person)) # Here

Podemos obtener todo en un objeto como una lista como se muestra a continuación:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
'__init__', '__init_subclass__', '__le__', '__lt__', '__module__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'age', 'gender', 'name', 'test1', 'test2', 'test3', 'test4', 'x1', 'x2']

Y, por lo que investigué y hice esta pregunta, no hay funciones para obtener solo las variables estáticas o especiales o los métodos normales, estáticos o especiales en un objeto en Python.

¿Ha sido útil esta solución?