He estado leyendo la documentación que describe la herencia de clases, las clases base abstractas e incluso las interfaces de Python. Pero nada parece ser exactamente lo que quiero. A saber, una forma simple de construir clases virtuales. Cuando se llama a la clase virtual, me gustaría que creara una instancia de una clase más específica en función de los parámetros que se le asignan y que devuelva la función de llamada. Por ahora tengo una forma resumida de redirigir las llamadas a la clase virtual a la clase subyacente.Clases virtuales: hacerlo bien?
La idea es la siguiente:
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)
Mi cambio de ruta está lejos de ser óptima, como llamadas sólo a los number_of_edges() la función sea traspasada. Agregando algo así como a la forma no costura para hacer el truco, ya sea:
def __getattr__(self, *args):
return underlying_class.__getattr__(*args)
Lo que estoy haciendo mal? ¿La idea está mal implementada? Cualquier ayuda muy apreciada.
'__getattr__' sólo funciona para las clases de nuevo estilo. Esto significa que tus clases tienen que ser subclases de 'objeto'. –
Lo que estás tratando de hacer también se conoce como una clase que tiene un constructor virtual (en lugar de "clases virtuales").Consulte la pregunta relacionada [_¿Qué es exactamente una Fábrica de clases? _] (Http://stackoverflow.com/questions/2526879/what-excaly-is-a-class-factory) – martineau