Llamo a un constructor en ClassA y quiero que el objeto resultante sea de una clase diferente (ClassB) si se cumple una determinada condición. He intentado reemplazar el primer argumento por __init __() ('self' en el ejemplo a continuación) dentro de __init __() pero no parece hacer lo que quiero.¿Cómo reemplazar una instancia en __init __() con un objeto diferente?
en el principal:
import ClassA
my_obj = ClassA.ClassA(500)
# unfortunately, my_obj is a ClassA, but I want a ClassB!
en claseA/__ init__.py:
import ClassB
class ClassA:
def __init__(self,theirnumber):
if(theirnumber > 10):
# all big numbers should be ClassB objects:
self = ClassB.ClassB(theirnumber)
return
else:
# numbers under 10 are ok in ClassA.
return
en ClassB/__ init__.py:
class ClassB:
pass
Bien, ahora, ¿qué ocurre si quiero cambiar el objeto por uno nuevo dentro de un método de objeto, en lugar de en el constructor? Quiero un objeto que se convierta en otros objetos durante su ciclo de vida. – sneak
@sneak, no se puede: el método obtiene 'self' como argumento y, por lo tanto, cualquiera que sea que se vuelvan a vincular a dicho nombre simple, no tendrá ningún efecto fuera del método. (Por supuesto, puede volver a enlazar ** nombres ** calificados como 'self .__ class__' - los nombres calificados y los nombres desnudos son totalmente diferentes en casi todos los aspectos que se le ocurran). –
@Alex, el hecho de que pueda asignar 'self .__ class__' es un accidente de implementación en CPython; la especificación oficial de Python dice que esto * no debería * funcionar. Incluso si no fue un accidente, es algo bastante horrible de hacer. En resumen: por favor no lo haga, y especialmente no lo sugiera a otras personas. – habnabit