【问题标题】:Class inheritance with arbitrary number of **kwargs?具有任意数量的 **kwargs 的类继承?
【发布时间】:2016-06-30 22:52:07
【问题描述】:

我正试图围绕类继承进行思考,但我不知道如何以直观的方式将 self 值从 Parent 类获取到 Child 类。理想情况下,我希望使用 **kwargs,因为我可能需要向 Parent 类添加额外的关键字变量。

class police_officer(object):
    def __init__(self, name=None, age='40'):
        self.name = name
        self.age = age

class police_chief(police_officer):
    def __init__(self):
        pass  # What should put I here to inherit the __init__() values?


new_officer = police_officer(name='Danny')
chief = police_chief(new_officer)

print(chief.name)

当我实例化 chief 时,我唯一的选择是显式调用每个变量吗? (示例):

chief = police_chief(name=new_officer.name, age=new_officer.age)

【问题讨论】:

  • police_chief(new_officer) - 不,不,不。您不会创建一个超类对象,然后围绕它构建一个子类对象。
  • 我不确定如何创建一个从父类继承但保持与原始对象相同的 self 值的新对象。有什么办法吗?
  • 你根本没有做一个“原始对象”。

标签: python inheritance init self keyword-argument


【解决方案1】:

在这种情况下,您可以在 police_chief 中完全省略 __init__

class police_chief(police_officer):
    """A police officer who is chief."""

在更一般的情况下,警察局长在__init__ 中进行额外设置,您可能会使用super

class police_chief(police_officer):
    def __init__(self, is_boss=True, **kwargs):
        super(police_chief, self).__init__(**kwargs)
        self.is_boss = is_boss

对 super1 小心一点。 There are some pitfalls.。但是,如果您关注well established idioms,您会没事的。你也可以通过police_officer.__init__(self, **kwargs) 绕过它。

1真正的问题不在于super(本身),更多的是多重继承的问题。对于单继承而言,使用 super 没有任何缺陷,使用它和直接调用超类方法之间没有真正的区别。


正如您所提到的,实例化警察局长的方法是将 police_officer 参数传递给警察局长的构造函数:

chief = police_chief(name=new_officer.name, age=new_officer.age)

如果您希望能够将一名警官提升为局长,您需要有一个替代构造函数:

class police_chief(police_officer):
    @classmethod
    def promote(cls, officer, **kwargs):  # create_from_officer is probably a better name ...
        return cls(
            name=officer.name,
            age=officer.age,
            **kwargs)

或者可能对代码进行重组,以完全不使用继承(而是使用某种形式的组合)。

【讨论】:

  • 或者在 Python3 中只是 super()。来吧,伙计们,已经是 $CURRENTYEAR 了!
  • 我的问题的很大一部分似乎是我无法像我想象的那样通过课程:new_officer = police_officer(name='Danny') Chief = police_chief(new_officer) 我如何复制将军官提升为酋长时的自我属性类似于姓名?
  • @Phil -- 你明确地做到了。查看我最近的编辑。
  • @o11c -- 是的。世界上的很多地方仍然停留在 python2.x 世界中,所以我尽量与两者兼容......
  • 我明白了,让我看看我是否可以重新编写代码以使其以这种方式工作。
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 2022-09-22
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多