No es una respuesta directa a la pregunta, pero en los puestos de abajo hay una solución para lo que Amirouche tratado de hacer:
y aquí está el código de trabajo muestra (Python 3.2.5).
class Men:
def __init__(self, name):
self.name = name
def who_are_you(self):
print("I'm a men! My name is " + self.name)
def cast_to(self, sex, name):
self.__class__ = sex
self.name = name
def method_unique_to_men(self):
print('I made The Matrix')
class Women:
def __init__(self, name):
self.name = name
def who_are_you(self):
print("I'm a women! My name is " + self.name)
def method_unique_to_women(self):
print('I made Cloud Atlas')
men = Men('Larry')
men.who_are_you()
#>>> I'm a men! My name is Larry
men.method_unique_to_men()
#>>> I made The Matrix
men.cast_to(Women, 'Lana')
men.who_are_you()
#>>> I'm a women! My name is Lana
men.method_unique_to_women()
#>>> I made Cloud Atlas
Nota del self.__class__
y no self.__class__.__name__
. Es decir. esta técnica no solo reemplaza el nombre de clase, sino que convierte una instancia de una clase (al menos ambos tienen el mismo id()
). Además, 1) No sé si es "seguro reemplazar un objeto propio por otro objeto del mismo tipo en el método [de un objeto]"; 2) trabaja con diferentes tipos de objetos, no solo con los que son del mismo tipo; 3) no funciona exactamente como quería amirouche: no puedes iniciar la clase como Class(args)
, solo Class()
(no soy profesional y no puedo responder por qué es así).
Ver también: http://stackoverflow.com/questions/1015592/why-is-self-in-python-objects-immutable – ShreevatsaR