首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在子类中扩展class属性的一种巧妙方法

在子类中扩展class属性的一种巧妙方法
EN

Stack Overflow用户
提问于 2009-05-25 16:28:54
回答 6查看 3.4K关注 0票数 16

假设我有以下类

class Parent(object):
    Options = {
        'option1': 'value1',
        'option2': 'value2'
    }

和一个名为Child的子类

class Child(Parent):
   Options = Parent.Options.copy()
   Options.update({
        'option2': 'value2',
        'option3': 'value3'
   })

我希望能够在子类中覆盖或添加选项。我使用的解决方案是有效的。但我相信有一种更好的方法。

编辑

我不想添加选项作为类属性,因为我有其他不是选项的类属性,而且我更喜欢将所有选项保存在一个地方。这只是一个简单的例子,实际的代码要复杂得多。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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)方法)。或者更花哨的,进入可能不是一个好主意的领域,元类/类装饰器。

票数 8
EN

Stack Overflow用户

发布于 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方法允许您覆盖它们一样。

票数 21
EN

Stack Overflow用户

发布于 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'

不过,我仍然对更好的解决方案持开放态度。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/907324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档