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?
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ó
AttribueError
alguna razón para esto.– Krishna Ozá
3 de mayo de 2020 a las 5:32
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.
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