In Python, say I have some class, Circle, that inherits from Shape. Shape needs x- and y-coordinates, and, in addition, Circle needs a radius. I want to be able to initialize Circle by doing something like,
c = Circle(x=1., y=5., r=3.)
Circle inherits from shape, so I need to use named arguments to __init__
, because different classes require different constructors. I could manually set x, y, and 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']
or, I could have the attributes of my Circle set automatically using 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)
The advantage of this is that there's less code and I don't need to maintain boilerplate like self.foo = kwargs['foo']
. The disadvantage is that it isn't obvious which arguments are needed for Circle. Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?
Thanks, everyone, for your thoughtful responses. The self.__dict__.update(**kwargs)
hack has been useful for me in experimenting with organizing my code, but I'll make sure that I replace that with properly passing arguments explicitly and doing clear error checking in production code.
class Shape(object): def __init__(self, x=None, y=None): self.x = x self.y = y class Circle(Shape): def __init__(self, r=None, **kwargs): super(Circle, self).__init__(**kwargs) self.r = r
And this is it. Don't use **kwargs
when you don't really need them.
Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?
When you have a choice between writing a simple, understandable code and headache code + nice docstrings, you actually don't have any choices, you just go and write simple, self-documented code:)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With