Dziedziczenie warunkowe.

Dziedziczenie warunkowe.
Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 220
0

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

Kopiuj
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:

Kopiuj
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

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6967
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

superdurszlak
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 2002
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:

Kopiuj
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()
Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 220
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ę :)

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

Nie chodzi Ci przypadkiem o wzorzec Strategia?

Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 220
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.

LP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 366
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.