我想在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
答案 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)
来调用它(调用中关键字参数的顺序无关紧要)。