python object-model

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.