Czytałem dokumentację opisującą dziedziczenie klas, abstrakcyjne klasy bazowe, a nawet interfejsy Pythona. Ale żadne szwy nie są dokładnie tym, czego chcę. Mianowicie prosty sposób budowania wirtualnych klas. Kiedy wywoływana jest klasa wirtualna, chciałbym utworzyć instancję klasy bardziej specyficznej w oparciu o podane parametry i przekazać funkcję wywołującą. Na razie mam krótki sposób przekierowania wywołań do klasy wirtualnej do klasy bazowej.Wirtualne klasy: robienie tego dobrze?
Idea jest następująca:
class Shape:
def __init__(self, description):
if description == "It's flat": self.underlying_class = Line(description)
elif description == "It's spiky": self.underlying_class = Triangle(description)
elif description == "It's big": self.underlying_class = Rectangle(description)
def number_of_edges(self, parameters):
return self.underlying_class(parameters)
class Line:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 1
class Triangle:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 3
class Rectangle:
def __init__(self, description):
self.desc = description
def number_of_edges(self, parameters):
return 4
shape_dont_know_what_it_is = Shape("It's big")
shape_dont_know_what_it_is.number_of_edges(parameters)
Moja przekierowanie jest daleka od optymalnej, jak nazywa się tylko do number_of_edges() funkcja przejdzie dalej. Dodanie czegoś takiego do Shape również nie daje rady:
def __getattr__(self, *args):
return underlying_class.__getattr__(*args)
Co robię źle? Czy cały pomysł został źle wdrożony? Każda pomoc bardzo doceniona.
'__getattr__' działa tylko dla klas w nowym stylu. Oznacza to, że twoje klasy muszą być podklasami obiektu. –
To, co próbujesz zrobić, jest również określane jako klasa mająca wirtualny konstruktor (a nie "wirtualne klasy").Zobacz powiązane pytanie [Czym dokładnie jest fabryka klas?] (Http://stackoverflow.com/questions/2526879/what-exactly-is-a-class-factory) – martineau