Dziedziczenie warunkowe.

0

Hej, zastanawiam się czy w pythonie jest możliwa taka konstrukcja:

class A():
    def __init__(self):
        self.a = 1

class B():
    def __init__(self):
        self.b = 2

class C(B):
    def __init__(self, var):
        super().__init__()
        if var:
            self += A.__init__() #Tu fantazjuje z tym `+=`
        self.c = 3 

No i jak widać (lub nie), chciałbym aby dziedziczenie po A, było warunkowe, oczywiście można to zrobić odwrotnie:

class C():
    def __init__(self, var):
        self.c = 3 

class B(C):
    def __init__(self, var):
        super().__init__(var)
        self.b = 2

class A(B):
    def __init__(self, var):
        super().__init__(var)
        self.a = 1

Jednak przyznam że w moim przypadku zdecydowanie wygodniejszą by była konstrukcja pierwsza, jest to możliwe do osiągnięcia?
Zakładam że najzwyczajniej mogę nie znać jakiejś magicznej metody :D

2

Chyba znalazłem sposób na scalenie klas (bo chyba o to Ci chodzi): https://www.daniweb.com/programming/software-development/code/283396/merging-class-instances

1

Jak słyszę dziedziczenie warunkowe to na myśl przychodzi mi taki twór, chociaż nie wiem czy to o to Ci chodzi i wątpię, by miało to większy sens:

class Foo:
  pass

class Bar:
  pass

if some_weird_condition:
  class TmpClass(Foo, Bar):
    pass
  Baz = TmpClass
else:
  class TmpClass(Foo):
    pass
  Baz = TmpClass


my_baz = Baz()
1

Właśnie o to mi chodziło co Spine wysłał :).

A dla zaspokojenia ciekawości w pytaniach, co daje mi taki twór:
Możliwość deklaracji jednej klasy Character, gdzie keyword argument dotyczący wytrenowanej AI jest ustawiony na False. Dodatkowo chciałbym aby AI mogło przejąć kontrolę w przypadku braku aktywności. Klasa AI zawiera wyłącznie proces decyzyjny, jednak waży całkiem sporo, więc chcę ograniczać jej obecność tam gdzie jest to zbędne. Zwłaszcza że docelowo będzie to bot na discorda :).

Problemu żadnego nie rozwiązuje, bo można to również rozwiązać innym ułożeniem klas, w kodzie i tak nikt tego nie będzie widział, ale dla mnie osobiście będzie czytelniejsze.
Przy okazji to część poszerzania wiedzy, o tym na jak dziwne twory pozwala Python :D.

@Spine, wiem jak to wygląda w innych językach, dlatego cieszę się możliwościami tego języka względem kombinowania i chciałbym poznać z tego jak najwięcej :).
Co nie zmienia faktu że praktyczność takich 'zabiegów' jest znikoma i w innym języku nawet o czymś takim nie myślę :)

3

Nie chodzi Ci przypadkiem o wzorzec Strategia?

0

@Patryk27: Tak, właśnie o coś takiego mi chodziło :).
Chociaż przyznam że nie znałem tego nazwy, dlatego próbowałem to jakoś inaczej zawrzeć :D.

0

Z mojego doświadczenia w javie / androidzie sugeruje używanie kompozycji ponad dziedziczeniem. Tak jak powiedział Patryk27 można to zrealizować przy pomocy Strategii. Moje doświadczenie w Pythonie jest naprawdę znikome, nie wydaje mi się jednak czy Twoje rozwiązanie jest dobre.

1 użytkowników online, w tym zalogowanych: 0, gości: 1