是否可以避免重写子类中的所有超类构造函数参数?
Is it possible to avoid rewriting all of a superclasses constructor parameters in a subclass?
举例来说,我有一个抽象的 class Animal
和多个参数参数,我想创建一个子 class 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)
有没有一种方法不包括在 Dog
的构造函数中复制所有 Animal
的构造函数参数?当有很多参数时,这会变得非常乏味,并且会使代码看起来重复。
您可以使用包罗万象的参数,*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')
举例来说,我有一个抽象的 class Animal
和多个参数参数,我想创建一个子 class 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)
有没有一种方法不包括在 Dog
的构造函数中复制所有 Animal
的构造函数参数?当有很多参数时,这会变得非常乏味,并且会使代码看起来重复。
您可以使用包罗万象的参数,*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')