TypeError: Super не принимает аргументы ключевого слова?

Во-первых, вот мой код:

class Enemy():
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage


    def is_alive(self):
        """Checks if alive"""
        return self.hp > 0

class WildBoar(Enemy):
    def __init__(self):
        super(WildBoar, name="Wild Boar", hp=10, damage=2).__init__()

class Marauder(Enemy):
    def __init__(self):
        super(Marauder, name="Marauder", hp=20, damage=5).__init__()


class Kidnappers(Enemy):
    def __init__(self):
        super(Kidnappers, name="The Kidnappers", hp=30, damage=7).__init__()

Когда я скомпилирую это, я получаю эту ошибку:

super(WildBoar, name="Wild Boar", hp=10, damage=2).__init__()
TypeError: super does not take keyword arguments

Я попытался оглянуться на любую помощь, но ничего не нашел. У меня также есть некоторые Kwargs в некоторых других классах, но это те, которые поднимают любые проблемы (на данный момент). Итак, что может быть причиной этого? Я также видел, как кто-то сказал, что установка super в базовом классе будет исправлена, но это не сработало (я передал те же аргументы, что и в базовом классе __init__).

Ответ 1

Аргументы родительского метода __init__ должны быть переданы методу __init__:

super(Kidnappers, self).__init__(name="The Kidnappers", hp=30, damage=7)
# or
super(Kidnappers, self).__init__("The Kidnappers", 30, 7)

Все, что вы передаете в super(), это дочерний класс (Kidnappers в этом случае) и ссылка на текущий экземпляр (self).


Обратите внимание, что если вы используете Python 3.x, все, что вам нужно сделать, это:

super().__init__("The Kidnappers", 30, 7)

и Python выработает все остальное.


Вот некоторые ссылки на то, где это объясняется в документации:

Ответ 2

Вариант №1: Python 2.7x

Здесь вы можете передать self keywork на super(), который по сути относится к свойствам экземпляра.

super(self, name="Wild Boar", hp=10, damage=2).__init__()

Вариант № 2: Python 3x

super() больше не нужны никакие параметры, и вы можете просто написать

super().__init__("The Kidnappers", 30, 7)