Wywołuję konstruktora w ClassA i chcę, aby wynikowy obiekt był innej klasy (ClassB), jeśli pewien warunek jest spełniony. Próbowałem zastąpić pierwszy argument do __init __() ("self" w poniższym przykładzie) wewnątrz __init __(), ale nie wydaje się, aby zrobić to, co chcę.Jak zamienić instancję w __init __() na inny obiekt?
w głównym:
import ClassA
my_obj = ClassA.ClassA(500)
# unfortunately, my_obj is a ClassA, but I want a ClassB!
w ClassA/__ 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
w ClassB/__ init__.py:
class ClassB:
pass
Ok, co teraz, jeśli chcę zamienić obiekt na nowy w metodzie obiektu, zamiast w konstruktorze? Chcę obiekt, który zamienia się w inne obiekty podczas swojego cyklu życia. – sneak
@sneak, nie możesz: metoda dostaje 'self' jako argument, więc cokolwiek mogą ponownie powiązać z nazwiskiem, nie będzie miało żadnego efektu poza tą metodą. (Możesz oczywiście ponownie powiązać ** kwalifikowane ** nazwy, takie jak 'self .__ class__' - kwalifikowane nazwy i paseczki są całkowicie różne pod każdym względem, o jakim myślisz). –
@Alex, fakt, że można przypisać do 'self .__ class__' jest przypadkiem wdrożenia w CPython; oficjalna specyfikacja Pythona mówi, że to * nie powinno * działać. Nawet jeśli to nie był wypadek, to strasznie. W skrócie: proszę, nie, a szczególnie proszę, nie sugeruj tego innym osobom. – habnabit