![](/img/trans.png)
[英]How can I take the variable from the parent class constructor and use it in the child class?
[英]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.