class Shape(object): def __init__(self, x=None, y=None):self.x = xself.y = yclass Circle(Shape): def __init__(self, r=None, **kwargs):super(Circle, self).__init__(**kwargs)self.r = r
就是这样。**kwargs当您真的不需要它们时,请不要使用。
这被认为是作弊还是良好的风格(只要Circle的界面有据可查)?
当您在编写简单的,易于理解的代码和头痛的代码+漂亮的文档字符串之间做出选择时,您实际上没有任何选择,您只需编写简单的,自我记录的代码即可:)
解决方法在Python中,假设我有一些从Shape继承的类Circle。形状需要x和y坐标,此外,圆需要半径。我希望能够通过执行以下操作来初始化Circle,
c = Circle(x=1.,y=5.,r=3.)
Circle继承自shape,因此我需要对使用命名参数__init__,因为不同的类需要不同的构造函数。我可以手动设置x,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’]
或者,我可以使用以下方式自动设置“圈子”的属性 self.__dict__.update(kwargs)
class Shape(object): def __init__(self,**kwargs):self.__dict__.update(**kwargs)class Circle(Shape): def __init__(self,self).__init__(**kwargs)
这样做的好处是代码更少,并且我不需要维护样板self.foo =kwargs[’foo’]。缺点是,Circle需要哪些参数并不清楚。这是作弊还是良好的风格(只要Circle的界面有据可查)?
谢谢大家的周到答复。self.__dict__.update(**kwargs)对于我进行组织代码的实验来说,该hack对我很有用,但是我将确保以适当地显式传递参数并在生产代码中进行清晰的错误检查的方式来代替它。