【发布时间】:2012-04-01 11:07:27
【问题描述】:
在 Python 中,假设我有一个类 Circle,它继承自 Shape。 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'] 这样维护样板文件。缺点是 Circle 需要哪些参数并不明显。这被认为是作弊还是这种风格很好(只要 Circle 的界面有据可查)?
感谢大家的深思熟虑的回复。 self.__dict__.update(**kwargs) hack 在我尝试组织代码时很有用,但我会确保用正确地显式传递参数并在生产代码中进行明确的错误检查来替换它。
【问题讨论】:
-
我认为这将允许调用者重载方法....但是如果您是唯一使用代码的人并且不担心恶意行为,那可能没问题。
-
@JoranBeasley - 是的,但如果你这样做了,你基本上就违反了规则,这是你自己的错。
标签: python oop dictionary