Cześć,
w jednym z kodów widziałem minej więcej takie podejście jak poniżej. Jest klasa abstrakcyjna AbstractClass. Klasy które z niej dziedziczą mają atrybuty, które nie były zdefiniowane w klasie bazowej. Dalej mamy funkcję get_class, która w zależności od parametru (albo czegokolwiek tam), zwraca którąś z klas, które implementują klasę abstrakcyjną, ale określone jest, że zwraca AbstractClass. No i w ostatniej linii odnosimy się do atrybutu klasa2.y, którego klasa AbstractClass, jak i ImplClass1 nie posiadają.
No i zakładając, że programista wie, że w tym miejscu zawsze będzie zwrócona ImplClass2, to czy takie podejście jest OK? Czy nie powinno być tak, że obiekt zwrócony z funkcji get_class będzimy traktować już tylko w kontekście metod które są zdefiniowane w AbstractClass?
Jak ewentualnie podchodzić do sytuacji, że jednak chcielibyśmy odnosić się do atrybutów zdefiniowanych poza klasą AbstractClass?
from dataclasses import dataclass
from abc import ABC
@dataclass
class AbstractClass(ABC):
def print(self):
pass
@dataclass
class ImplClass1(AbstractClass):
x:int
def print(self):
print(self.x)
@dataclass
class ImplClass2(AbstractClass):
x:int
y:int
def print(self):
print(f'{self.x} {self.y}')
def get_class(nr:int)->AbstractClass:
if nr == 1:
return ImplClass1(1)
return ImplClass2(2,3)
klasa2 = get_class(2)
print(klasa2.y)