繁体   English   中英

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

[英]How can I simply pass arguments to parent constructor in child class?

我想在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

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

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

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

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

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

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

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

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

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出现在base args之前)。

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

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)调用此方法(调用中关键字参数的顺序无关紧要)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM