【问题标题】:What is a correct way to override child __init__ function?覆盖子 __init__ 函数的正确方法是什么?
【发布时间】:2019-07-26 13:18:57
【问题描述】:

给定这样的子父结构:

class Parent:
    def __init__(self, param1=1, param2=2, param3=3, param4=4):
        """
        Parent docstring here
        :param param1: param1 stuff
        :param param2: param2 stuff
        :param param3: param3 stuff
        :param param4: param4 stuff
        """
        self.param1 = param1
        self.param2 = param2
        self.param3 = param3
        self.param4 = param4


class Child(Parent):
    def __init__(self, param1=1, param2=2, param3=3, param4=4,
                 child_param1='a', child_param2='b', child_param3='c'):
        """
        Child implementation of parent.
        :param param1: do I need this again???
        :param param2: do I need this again???
        :param param3: do I need this again???
        :param param4: do I need this again???
        :param child_param1: child parameter 1
        :param child_param2: child parameter 2
        :param child_param3: child parameter 3
        """
        super().__init__(param1, param2, param3, param4)
        self.child_param3 = child_param3
        self.child_param1 = child_param1
        self.child_param2 = child_param2

在不重复父级文档字符串和每个单独参数的情况下实现子级的正确方法是什么?我希望从父级继承参数描述。我也不想每次从父级继承时都重新指定默认值。我可以这样做,但这似乎不是正确的方法:

class Child(Parent):
    def __init__(self, child_param1='a', child_param2='b', child_param3='c', **parent_args):
        super(**parent_args)
        # rest of the code goes here...

【问题讨论】:

  • 我猜你可以做self.__init__.__doc__ = super().__init__.doc__。对于参数,您的最后一个示例确实对我来说似乎是正确的方法。
  • 将 kwargs 传递给父级是很常见的。我在很多项目中都看到过。我不知道这是否是一个好习惯。

标签: python oop inheritance docstring


【解决方案1】:

您不能从父级继承默认值,但您可以拥有一个“特殊(唯一)”默认值,然后使用它来设置“真实”默认值。例如

DEFAULT = object()


class Vehicle:
    DEFAULT_WHEELS = 4

    def __init__(self, wheels=DEFAULT):
        if wheels is DEFAULT:
            wheels = self.DEFAULT_WHEELS
        self.wheels = wheels


class Car(Vehicle):
    DEFAULT_COLOUR = "Red"

    def __init__(self, colour=DEFAULT, **kwargs):
        super().__init__(**kwargs)

        if colour is DEFAULT:
            colour = self.DEFAULT_COLOUR
        self.colour = colour


# You can also use the class-level default to modify the
# defaults without having to re-write the init:

class Tricycle(Vehicle):
    DEFAULT_WHEELS = 3

【讨论】:

  • 是的,试过了,这个答案最有意义 - 将默认值设置为父级中的静态变量,然后覆盖子级中的默认值。谢谢!
猜你喜欢
  • 2014-12-26
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2019-05-04
  • 2020-07-22
相关资源
最近更新 更多