En Python, supongamos que tengo una clase, Circle, que hereda de Shape. La forma necesita coordenadas xey, y, además, el círculo necesita un radio. Quiero ser capaz de inicializar Círculo haciendo algo como,¿Es propio .__ dict __. Actualización (** kwargs) estilo bueno o pobre?
c = Circle(x=1., y=5., r=3.)
Círculo hereda de forma, por lo que necesito utilizar argumentos con nombre de __init__
, debido a diferentes clases requieren diferentes constructores. Podría configurar manualmente x, y y r.
class Shape(object):
def __init__(self, **kwargs):
self.x = kwargs['x']
self.y = kwargs['y']
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
self.r = kwargs['r']
o, podría tener los atributos de mi círculo establecer automáticamente self.__dict__.update(kwargs)
class Shape(object):
def __init__(self, **kwargs):
self.__dict__.update(**kwargs)
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
La ventaja de esto es que hay menos código y que no es necesario para mantener repetitivo como self.foo = kwargs['foo']
. La desventaja es que no es obvio qué argumentos son necesarios para Circle. ¿Esto se considera un truco o es este buen estilo (siempre que la interfaz con Circle esté bien documentada)?
Gracias, a todos, por sus respuestas reflexivas. El truco self.__dict__.update(**kwargs)
me ha sido útil para experimentar con la organización de mi código, pero me aseguraré de que lo reemplace con la aprobación adecuada de los argumentos explícitamente y la comprobación clara de errores en el código de producción.
Creo que esto le permitiría a un llamador sobrecargar métodos ... pero si usted es la única persona que usa el código y no está preocupada por el comportamiento malicioso, probablemente esté bien. –
@JoranBeasley - Sí, pero si lo has hecho, esencialmente estás incumpliendo las reglas, y es tu culpa. –
Te estás perdiendo 'self'. –