Jak zastąpić obiekt klasy A obiektem klasy B

0

Cześć, moje pytanie jest czysto teoretyczne.

Mam sobie w pythonie klasę A która posiada jakieś metody x,y,z, został stworzony obiekt:
objA=A(aa, bb, cc)

z wywoływanymi metodami
objA.x()
objA.y()
objA.z()

Mam także druga klasę B która posiada jakieś metody i,j i podobnie jak powyżej został dla niej stworzony obiekt.
Wszystkie te obiekty wykorzystuje inna klasa C i właśnie w tej klasie wszystkie obiekty klasy A chciałbym zastąpić obiektami klasy B.

Czy istnieje w Pythonie możliwość aby zrobić coś takiego ? Utworzyć nową klasę abstrakcyjną z jakimiś metodami ?

1

Pytanie, po co ci to potrzebne? Czy to czasem nie xy?

0

@lion137: Powiedzmy że klasa C jest jakimś szefem i chce mieć takie prawo do zmiany obiektu :)

0

Python jest dynamiczny, to coś takiego ma mało sensu; jak już chcesz, to wykorzystaj duck typing:
https://en.m.wikipedia.org/wiki/Duck_typing

0

Jaki to miałoby sens konkretnie? Co się stanie jak podmienisz swoje A na B ale w kodzie C miałeś objA.x()? Przecież B nie ma metody x() więc co się niby ma stać jak ktoś ją zawoła?

0

@Shalom @lion137
Wyraziłem się może niejasno za co przepraszam.
Wyobraźmy sobie sytuację w której mam klasę C z pewną metodą x. W metodzie tej losuje pewne funkcje y do wykonania z klasy A i klasy B.
Jeśli metoda x z klasy C wylosuje do wykonania metodę y z klasy A, to czy ja mogę zamieniać tę metodę y z klasy A, metodą y z klasy B?

1

Weź napisz konkretny przykład. Mam wrażenie, że to można przepisać w jakiś inny sposób. Może w ogóle nie jest potrzebna obiektówka do tego? A może wystarczy tfu, dziedziczenie? Może wystarczy duck typing i określone nazwy metod? A może trzeba zrobić prosty wrapper i niestety napisać te ify?

No ale mam ogólne wrażenie, że brak jest nam jakiejś informacji o tym, co chcesz osiągnąć, tak dokładniej. Tzn. nie "mam klasę C z pewną metodą x", tylko ogólnie, co chcesz osiągnąć. Może dałoby się to inaczej zrobić, prościej, jakbyśmy znali kontekst.

0

@LukeJL: Dobrze, postaram się to jakoś zgrabnie opisać.

Mamy klasę C z jakąś listą obiektów Samochód i Motor.
lista.append(Samochód('ŁadnySamochód', 1992, 2500,'Kombi')
lista.append(Samochód('ŁadnySamochód', 2008, 9700,'Sedan')
// Samochody mają metodę Drive która zwracam 'BrumBrum'

lista.append(Motor('ŁadnyMotor', 2009,3750)
lista.append(Motor('ŁadnyMotor',2011,5750)
// Motory mają metodę Drive2 która zwraca 'BrumBrum2'

w klasie C mam jakąś funkcję losuj która losuje nazwy obiektów Samochód i Motor np. ŁadnySamochód, ŁadnyMotor itp.
Jeśli w metoda 'losuj' w klasie C wylosuje z tej listy obiektów ŁadnySamochód wywoła na tym obiekcie metodę ŁadnySamochod.Drive() i ja bym chciał podmienić aby po wylosowaniu ŁadnySamochód nie wykonywał metody drive, ale wykonał ŁadnyMotor.Drive2()

Klasa C przechowuje to w tablicy i (ja to sobie tylko wizualizuje w głowie )

zabaweczki=choice(tutaj_tablica_obiektow)
i w if sprawdza jesli wylosowano ŁadneSamochod wykonaj metodę Drive

Ja się tylko i wyłącznie pytam w aspekcie teoretycznym nie mam jakiegoś określonego zadania

0

Wciąż nie mam pewności, czy dobrze rozumiem Twoje potrzeby, ale pachnie mi to wzorcem adapter.

0

@Pyxis: Nie mam pojęcia czym to pachnie :) ale czy jest jakiś sposób podmiany tych metod ?

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