【问题标题】:How can I set override default kwargs in a parent class?如何在父类中设置覆盖默认 kwargs?
【发布时间】:2016-06-23 08:04:02
【问题描述】:

假设我有以下父类和子类:

class A(object):
    def __init__(self, *args, **kwargs):
        self.a = kwargs.get('a', 'default_A')
        self.b = kwargs.get('b', 'default_B')

class B(A):

    a = "override_A"

    def __init__(self, *args, **kwargs):
        super(B, self).__init__(**kwargs)

b = B()

print b.b  # this is "default_B", as expected
print b.a  # I expected this to be "override_A"

我在这里做错了什么?我试图通过this one 之类的答案来了解继承的工作原理,但没有找到描述此特定要求的内容。

【问题讨论】:

  • @jonrsharpe 我刚刚添加了语义打印语句。如果您运行确切的代码,您会很快意识到问题不是打印错误。
  • 是的,我已经编辑了这个问题,希望能更清楚。您没有区分哪些输出是预期的,哪些不是。

标签: python


【解决方案1】:

您正在混合类和实例变量。 B.a是一个类变量,被A.__init__()中设置的实例变量所遮蔽。

例如,您可以使用dict.setdefault():

class B(A):

    def __init__(self, *args, **kwargs):
        # If the key 'a' exists, this'll be effectively no-operation.
        # If not, then 'a' is set to 'override_A'.
        kwargs.setdefault('a', 'override_A')
        super(B, self).__init__(**kwargs)

【讨论】:

  • 为什么是(ab)?这是对setdefault() 的完美使用。
猜你喜欢
  • 1970-01-01
  • 2019-05-09
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2015-06-30
相关资源
最近更新 更多