在Python中,假设我有一些继承自Shape的类Circle。 Shape 需要 x 和 y 坐标,此外,Circle 需要半径。我希望能够通过执行类似的操作来初始化 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, **kwargs):
super(Circle, self).__init__(**kwargs)
这样做的好处是代码更少,而且我不需要维护像self.foo = kwargs['foo']
这样的样板文件。 。缺点是 Circle 需要哪些参数并不明显。这被认为是作弊还是这种风格很好(只要 Circle 的接口(interface)有详细的文档记录)?
谢谢大家的周到回复。 self.__dict__.update(**kwargs)
hack 对我尝试组织代码很有用,但我会确保用正确显式传递参数并在生产代码中进行清晰的错误检查来替换它。
最佳答案
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
就是这样。当您并不真正需要时,请勿使用 **kwargs
。
Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?
当你在编写简单、易懂的代码和令人头疼的代码 + 漂亮的文档字符串之间做出选择时,你实际上没有任何选择,你只需去编写简单的、自文档化的代码:)
关于python - self.__dict__.update(**kwargs) 的风格是好是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57082774/