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

Cha*_*eon 5 python

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

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

class Page(object):
  def __init__(self, name):
    self.name = name
Run Code Online (Sandbox Code Playgroud)

我想得到一些孩子:

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能跳过重写整个变量列表来调用super方法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
Run Code Online (Sandbox Code Playgroud)

Rai*_*ito 8

我认为你的代码很破坏或未经测试(错误的缩进,错误的语法),因为它不会当前运行,也许你应该编辑.

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

class PageWithImage(Page):
    def __init__(self, *args, **kwargs):
        super(PageWithImage, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

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

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

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


Blc*_*ght 5

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

但是,您可以在开始时扩展参数:

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)
Run Code Online (Sandbox Code Playgroud)

您可以使用类似的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)
Run Code Online (Sandbox Code Playgroud)

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