Ho letto la documentazione che descrive l'ereditarietà della classe, le classi base astratte e persino le interfacce python. Ma niente sembra essere esattamente quello che voglio. Vale a dire, un modo semplice per costruire classi virtuali. Quando viene chiamata la classe virtuale, mi piacerebbe istanziare una classe più specifica in base a quali parametri sono assegnati e restituire la funzione di chiamata. Per ora ho un modo sommario per reindirizzare le chiamate alla classe virtuale fino alla classe sottostante.Classi virtuali: farlo bene?
L'idea è la seguente:
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)
mio dirottamento è lungi dall'essere ottimale, come le chiamate solo ai number_of_edges() funzione viene passato su. L'aggiunta di qualcosa di simile per forma non cucitura a fare il trucco o:
def __getattr__(self, *args):
return underlying_class.__getattr__(*args)
Quello che sto facendo male? L'intera idea è mal implementata? Qualsiasi aiuto molto apprezzato.
'__getattr__' funziona solo per classi di nuovo stile. Questo significa che le tue classi devono essere sottoclassi di 'object'. –
Quello che stai cercando di fare è anche definito come una classe con costruttore virtuale (piuttosto che "classi virtuali").Vedi domanda correlata [_Che cos'è esattamente una fabbrica di classe? _] (Http://stackoverflow.com/questions/2526879/what-exactly-is-a-class-factory) – martineau