Вот пример, где я использую args
и kwargs
, чтобы сделать код намного более СУХИМ.Я создаю один базовый класс с параметрами, от которых могут наследоваться все остальные.
Таким образом, все компоненты имеют сопротивление, так что вы можете иметь это в качестве аргумента в базовом классе и никогда не повторять его в других классах, которыенаследовать от него.
class Mammal(object):
def __init__(self, genus, species, agility, *extra_args, **extra_kwargs):
#extra is ignored as the subclasses handle them differently
self.species = species
self.genus = genus
self.agility = agility
def speak(self):
print("Generic {0} making generic {0} sounds".format(self.genus + " " + self.species))
class Human(Mammal):
def __init__(self, *args, **kwargs): #DRYer that re-listing the parameters
super().__init__(*args, **kwargs) #Call init of Mammal
self.intelligence = args[-1] #Uses args
class Hedgehog(Mammal):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.spikiness = kwargs["spikiness"] #Uses kwargs
stephen_hawking = Human("Homo", "Sapiens", 1, 100)
#100 is added to args and handled with self.intelligence = args[-1]
sanic = Hedgehog("Erinaceus", "Europaeus", (2 ** 63) - 1, spikiness = 10)
Итак, для человека я добавил дополнительный аргумент, специфичный для человеческого класса, интеллект.Он добавляется простым добавлением другого аргумента в инициализацию и обработкой его в Human.__init__
.Для ежа я добавил дополнительный аргумент ключевого слова, который обрабатывается путем получения значения ключа spikiness
.Оба из них могут быть использованы в сочетании.Если бы я хотел, я мог бы вместо этого создать класс PricklyMammal
с добавлением spikiness
и сделать наследниками Porcupine
, Hedgehog
и Cactus
, все из которых будут иметь аргументы по умолчанию и аргументы ключевых слов PricklyMammal
: Те из Mammal
и дополнительные, которые я добавил к PricklyMammal
Я не знаю, сколько вы знаете об этом, извините, если что-то из этого было немного покровительственно, но я надеюсь, чтоэто помогает!
PS Без обид, Стивен Хокинг.Мы любим тебя.