En Python, ¿cuál es la diferencia entre un objeto y un diccionario?
title in python plot (5)
Después de crear un objeto, puedo agregar y eliminar espacios a voluntad, como puedo hacer con un diccionario. Incluso los métodos son solo objetos almacenados en ranuras, así que probablemente también pueda agregar métodos a un diccionario.
¿Hay algo que pueda hacer con un objeto (no diccionario) que nunca podría hacer con un diccionario? ¿O es posible configurar un diccionario que se vea completamente como un objeto de cierta clase?
Esta pregunta no es sobre cómo se crean, sino sobre cómo puedo usarlos después. Se aprecian enlaces o referencias.
Después de crear un objeto, puedo agregar y eliminar espacios a voluntad, como puedo hacer con un diccionario. Incluso los métodos son solo objetos almacenados en ranuras,
Tenga cuidado al decir slots: __slots__
tiene un significado específico en Python .
así que probablemente pueda agregar métodos a un diccionario también.
foo = {}
foo.bar = 1
AttributeError: ''dict'' object has no attribute ''bar''
No por defecto, deberías subclasificarlo, pero luego estás usando una clase. En su lugar, poner la función en el diccionario:
def bar():
return 1
foo[''bar''] = bar
foo[''baz''] = lambda: 1
¿Hay algo que pueda hacer con un objeto que nunca podría hacer con un diccionario?
Esta pregunta en realidad tiene una premisa falsa: los diccionarios son objetos , por lo que todo lo que haga con un diccionario lo está haciendo con un objeto . Para el resto de esta respuesta, pretenderé que te refieres a "clase definida por el usuario" cuando dices "objeto".
No, no hay nada que puedas hacer con una clase definida por el usuario que no puedas hacer con un diccionario. Las clases incluso se implementan con un diccionario.
class Foo(object):
pass
print Foo.__dict__
# {''__dict__'': <attribute ''__dict__'' of ''Foo'' objects>, ''__module__'': ''__main__'',
# ''__weakref__'': <attribute ''__weakref__'' of ''Foo'' objects>, ''__doc__'': None}
Cualquier cosa que pueda hacer con una clase en Python se puede hacer sin una, con más trabajo (y código que es mucho más difícil de entender, usar y mantener). Incluso se ha dicho que las clases de Python son solo azúcar sintáctica para los diccionarios.
Una pregunta muy similar se formuló recientemente: ¿Necesito aprender sobre objetos o puedo ahorrar tiempo y simplemente aprender diccionarios? Creo que mi respuesta a eso también es relevante aquí.
Creo que preguntas por
o1={"some_method": lambda par1, par2: par1+par2}
o1["some_method"](1, 2)
vs
class SomeClass:
def some_method(self, par1, par2):
return par1+par2
o2=SomeClass()
o2.some_method(1, 2)
? Si es así, creo que la principal diferencia desde el punto de vista práctico es que o2.some_method
toma self como primer o1["some_method"]
pero o1["some_method"]
no.
Cuando llama a funciones miembro de un objeto, se les pasa el objeto como primer parámetro. De esta manera pueden modificar las propiedades del objeto al que pertenecen:
class Counter(object):
def __init__(self):
self.num = 0
def inc(self):
self.num += 1
count = Counter()
count.inc()
Si solo almacena un montón de funciones en un dict
, no obtendrán tal soporte. Tienes que pasar el dictado manualmente para lograr el mismo efecto:
def Counter_inc(d):
d[''num''] += 1
def Counter_create():
d = {
''num'': 0,
''inc'': Counter_inc,
}
return d
count = Counter_create()
count[''inc''](count)
Como puedes ver mientras es posible, es mucho más torpe. Si bien puede emular muchas características de objetos con dictados en bruto, tener un soporte de lenguaje especial para objetos hace que sean más fáciles de usar.
También hay características que utilizan directamente una información de tipo de objetos, como por ejemplo isinstance()
, que no se puede replicar fácilmente con dictados en bruto.
El objeto es un {} creado desde la clase:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Student(''John'', 31) # student1 is an object
print(student1) # does not print the expected result, we need to "convert" it to dictionary
print(student1.__dict__) # prints {''name'': ''John'', ''age'': 31}
Diccionario es un {} no creado desde la clase:
student2 = { ''name'': ''Kevin'', age: 15 } # student2 is a dictionary
print(student2) # prints {''name'': ''Kevin'', ''age'': 15}
Las otras respuestas tienen algo de terreno, pero me gustaría agregar que no se pueden crear subclases ni crear instancias de diccionarios específicos.
class A(object): pass
class B(A): pass
a = A()
A = {}
B = ???
a = ???
Por lo tanto, los diccionarios son objetos y los objetos se implementan principalmente con diccionarios (aunque no conozco los detalles), pero son herramientas diferentes para diferentes trabajos.