tuplas punteros objetos mutables inmutables inmutable inmutabilidad ejemplos python object

objetos - punteros python



¿Por qué `self` en objetos Python es inmutable? (6)

¿Por qué no puedo realizar una acción como la siguiente?

class Test(object): def __init__(self): self = 5 t = Test() print t

Esperaría imprimir 5 ya que estamos sobrescribiendo la instancia con él, pero en cambio no hace nada. Ni siquiera arroja un error. Solo ignora la tarea.

Entiendo que casi no habría situaciones en las que uno quisiera hacer eso, pero aún parece extraño que no pueda hacerlo.

Actualización: ahora entiendo por qué no funciona, pero aún me gustaría saber si hay alguna forma de reemplazar una instancia desde dentro de la instancia.


A veces quieres hacer esto, aunque no con tipos inmutables como int :

>>> class Test(list): ... def __init__(self): ... list.__init__(self, [1,2,3]) # self = [1,2,3] seems right, but isn''t >> t = Test() >> print t [1, 2, 3]


Acabo de hacer una prueba rápida y puedes asignarte a ti mismo. Dentro de tu método init (), imprime el valor de ti mismo. Verás que son 5.

Lo que te falta aquí es que los parámetros se pasan por valor en Python. Por lo tanto, cambiar el valor de una variable en una función o método no lo cambiará para el mundo exterior.

Dicho todo esto, recomendaría encarecidamente no cambiar nunca.


Dr. Egon Spengler: Sería malo.
Dr. Peter Venkman: Estoy confuso sobre todo lo bueno / malo. ¿Qué quieres decir con "malo"?
Dr. Egon Spengler: Trate de imaginar que toda la vida tal como la conoce se detiene instantáneamente y que cada molécula de su cuerpo explota a la velocidad de la luz.


No "ignora" la tarea. La asignación funciona bien, creaste un nombre local que apunta a los datos 5.

Si realmente quieres hacer lo que estás haciendo ...

class Test(object): def __new__(*args): return 5


Cualquier asignación simple a cualquier argumento de cualquier función se comporta exactamente de la misma manera en Python: vincula ese nombre a un valor diferente, y no hace nada más en absoluto. "¡Ningún caso especial es lo suficientemente especial como para romper las reglas", como dice el Zen de Python! -)

Entonces, lejos de ser extraño (que simplemente = asignar un argumento específico en una función específica no tiene ningún efecto externo visible), sería completamente sorprendente si este caso específico funcionara de otra manera, solo por los nombres de los función y argumento en cuestión.

Si alguna vez desea crear una clase que construya un objeto de un tipo diferente a sí mismo, dicho comportamiento es por supuesto muy posible, pero se obtiene anulando el método especial __new__ , not __init__ :

class Test(object): def __new__(cls): return 5 t = Test() print t

Esto emite 5 . El comportamiento __new__ / __init__ en Python es un ejemplo del patrón de diseño de "construcción en dos pasos": el "constructor" propiamente dicho es __new__ (construye y devuelve un objeto (normalmente no inicializado) (normalmente uno nuevo del tipo / clase en pregunta); __init__ es el "inicializador" que inicializa adecuadamente el nuevo objeto.

Esto permite, por ejemplo, la construcción de objetos que son inmutables una vez construidos: en este caso todo debe hacerse en __new__ , antes de que se construya el objeto inmutable, ya que, dado que el objeto es inmutable, __init__ no puede mutarlo para inicializarlo eso.


class Test(object): def __init__(self): self = 5 t = Test() print t

es como tener este PHP (solo otro idioma lo sé, lo siento)

class Test { function __construct() { $this = 5; } }

No veo cómo tiene sentido. reemplazando la instancia con un valor?