是否有可能避免重写子类中的所有超类构造函数参数?

时间:2017-10-29 12:55:45

标签: python python-3.x class code-duplication

比如说我有一个带有多个参数参数的抽象类Animal,我想创建一个包含所有Dog属性的子类Animal,但附加属性race。据我所知,这是唯一的方法:

from abc import ABC

class Animal(ABC):
    def __init__(self, name, id, weight):
        self.name = name
        self.id = id
        self.weight = weight

class Dog(Animal):
    def __init__(self, name, id, weight, race) # Only difference is race
        self.race = race
        super().__init__(name, id, weight)

有没有办法做到这一点,不包括在Animal的构造函数中复制所有Dog的构造函数参数?当有很多参数,以及使代码看起来重复时,这可能会非常繁琐。

1 个答案:

答案 0 :(得分:4)

您可以使用catch-all参数*args**kwargs,并将这些参数传递给父级:

class Dog(Animal):
    def __init__(self, race, *args, **kwargs):
        self.race = race
        super().__init__(*args, **kwargs)

这确实需要在前面添加其他位置参数:

Dog('mongrel', 'Fido', 42, 81)

您仍然可以在调用时明确命名每个参数,此时顺序不再重要:

Dog(name='Fido', id=42, weight=81, race='mongrel')