假设我有以下类
class Parent(object):
Options = {
'option1': 'value1',
'option2': 'value2'
}
和一个名为Child的子类
class Child(Parent):
Options = Parent.Options.copy()
Options.update({
'option2': 'value2',
'option3': 'value3'
})
我希望能够在子类中覆盖或添加选项。我使用的解决方案是有效的。但我相信有一种更好的方法。
编辑
我不想添加选项作为类属性,因为我有其他不是选项的类属性,而且我更喜欢将所有选项保存在一个地方。这只是一个简单的例子,实际的代码要复杂得多。
发布于 2009-05-25 17:05:44
一种方法是使用dict的关键字参数来指定其他键:
Parent.options = dict(
option1='value1',
option2='value2',
)
Child.options = dict(Parent.options,
option2='value2a',
option3='value3',
)
如果你想变得更花哨,那么使用描述符协议,你可以创建一个代理对象来封装查找。(只需将所有者从owner属性遍历到__get__( owner.__mro__,instance,owner)方法)。或者更花哨的,进入可能不是一个好主意的领域,元类/类装饰器。
发布于 2009-05-25 17:25:20
在语义上等同于您的代码,但可以说更简洁:
class Child(Parent):
Options = dict(Parent.Options,
option2='value2',
option3='value3')
请记住,“没有大括号会更好”,通过显式调用dict
,通常可以避免大括号(以及类似于标识符的常量字符串的键周围的额外引号)。
有关更多详细信息,请参阅http://docs.python.org/library/stdtypes.html#dict --关键位是“如果在位置参数和关键字参数中都指定了键,则保留与关键字关联的值”,即关键字参数覆盖位置参数中的键值关联,就像update
方法允许您覆盖它们一样。
发布于 2009-05-25 17:26:23
经过更多的思考,感谢@SpliFF的建议,这是我想出来的:
class Parent(object):
class Options:
option1 = 'value1'
option2 = 'value2'
class Child(Parent):
class Options(Parent.Options):
option2 = 'value2'
option3 = 'value3'
不过,我仍然对更好的解决方案持开放态度。
https://stackoverflow.com/questions/907324
复制相似问题