Is self.__dict__.update(**kwargs) good or poor style?
在python中,假设我有一些类,circle,它继承自shape。形状需要x和y坐标,此外,圆需要半径。我想通过这样做来初始化圆,
1 | c = Circle(x=1., y=5., r=3.) |
圆继承自形状,所以我需要对
1 2 3 4 5 6 7 8 9 | 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'] |
或者,我可以使用
1 2 3 4 5 6 7 | class Shape(object): def __init__(self, **kwargs): self.__dict__.update(**kwargs) class Circle(Shape): def __init__(self, **kwargs): super(Circle, self).__init__(**kwargs) |
这样做的好处是代码较少,而且我不需要像
谢谢大家的周到回答。
1 2 3 4 5 6 7 8 9 | 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 |
就是这样。当你真的不需要时,不要使用
Is this considered a cheat or is this good style (as long as the
interface to Circle is well-documented)?
当您在编写简单、易懂的代码和头疼的代码+好的docstrings之间做出选择时,实际上您没有任何选择,您只需编写简单、自我记录的代码:)
我想说,第一种方法肯定更可取,因为显式比隐式好。
考虑一下,如果在初始化一个圆时输入了错别字,会发生什么情况,比如
如果您希望自动分配,我建议采用以下方法:
1 2 3 | def __init__(self, **kwargs): for key, value in kwargs.iteritems(): setattr(self, key, value) |
就风格而言,它介于明确地编写和使用
如果你想让它更明显,你可以让
您甚至可以在
1 2 3 4 | class Circle(Shape): def __init__(self, **kwargs): self.check(kwargs, 'x', 'y', 'r') super(Circle, self).__init__(**kwargs) |
否则,如果您记录了您的接口,并且它按照文档的方式工作,那么它总是可以的。你做的任何其他事情都能像我们"期望"的那样工作(为错误的论点抛出异常)是一个额外的收获。