在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)
自动设置我的Circle的属性。
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']
这样的样板文件。缺点是不明确哪些参数是圆形所需的。这算作弊吗?或者这是一个好的风格(只要向圆形接口进行了良好记录)?感谢大家的周到回复。对于我在组织我的代码时使用的
self.__dict__.update(**kwargs)
技巧很有用,但我会确保用显式传递参数和在生产代码中进行明确的错误检查来替换它。