我怎样才能简单地将参数传递给子类中的父构造函数?

时间:2015-02-08 20:41:13

标签: python

我想在Python中设计一些派生类,但不知道如何在没有太多努力和代码的情况下使其变得非常简单。

让我解释一下,我有以下课程:

class Page(object):
  def __init__(self, name):
    self.name = name

我想得到一些孩子:

class PageWithImage(Page):
  def __init__(self, name, image):
    # Need I do this boring code? - how to replace it?
    super(PageWithImage, self).__init__(name = name)
    self.image = image

如何跳过对name = name等超级方法调用的整个变量列表的重写? (因为可能有很多这样的变量)

如何让它更具可读性? (更少的代码通常更具可读性)

我不喜欢我编写的代码 - 因为自动完成功能不适用于此代码:

class PageWithImage(Page):
  def __init__(self, *args, **kwrds):
    # Need I do this boring code? - how to replace it?
    super(PageWithImage, self).__init__(*args, **kwrds)
    self.image = image

2 个答案:

答案 0 :(得分:6)

我认为您的代码已经破坏或未经测试(缩进错误,语法错误),因为它目前无法运行,也许您应该编辑。

但是如果你想简化你的超级电话" :

class PageWithImage(Page):
    def __init__(self, *args, **kwargs):
        super(PageWithImage, self).__init__(*args, **kwargs)

它将获取所有参数和关键字参数(如果您不需要关键字参数,请删除** kwargs)。

是的,较少的代码通常更具可读性,但并非总是如此,列表推导,使用* args和** kwargs,lambda等的复杂函数......可能模糊有时候对于开发者,即使他们节省了+20个字符

因此,如果参数的数量可以很容易地为~10,那么您应该尝试将它们重新设计或填充到字典或列表中,具体取决于这些参数的性质。

答案 1 :(得分:4)

无法以简单的方式扩展参数列表。如果你想这样做,你几乎每次都需要写出所有的参数。

但您可以在开头扩展参数:

class Base(object):
    def __init__(self, base_arg0, base_arg1, base_arg2):
        pass

class Derived(Base):
    def __init__(self, derived_arg, *args):
        super().__init__(*args)

你用Derived(da, ba0, ba1, ba2)之类的方式调用它(注意派生的arg位于基础args之前)。

在Python 3中,您还可以通过在参数列表中放置一个裸*来指定仅关键字参数:

class BaseKW(object):
    def __init__(self, *, base_arg):
        pass

class DerivedKW(BaseKW):
    def __init__(self, *, derived_arg, **kwargs):
        super().__init__(**kwargs)

你可以用DerivedKW(derived_arg=da, base_arg=ba)DerivedKW(base_arg=ba, derived_arg=da)来调用它(调用中关键字参数的顺序无关紧要)。