Где в моем коде что-то пошло не так?

#python #python-3.x

#python #python-3.x

Вопрос:

 class Player:
    def __init__(self):
        self.speed
        self.hp
def Berserker(self):
    self.speed == 12
    self.hp == 6

print("Berserkers stats are: "   Berserker())
  

Итак, что я сделал не так? Как вы можете видеть, я совсем новичок в Python.
Ошибка, которую я получаю, такова: TypeError: в Berserker () отсутствует 1 требуемый позиционный аргумент: ‘self’

Комментарии:

1. Ваш __init__ ничего не делает. Он также выдаст AttributeError при попытке создать экземпляр вашего класса. Вам следует начать с базового руководства по Python, а затем перейти к ООП.

2. И ваш Berserker метод не имеет правильного отступа в вашем классе, поэтому он обрабатывается не как метод экземпляра, а как функция.

3. Вы имели в виду, что berserker должен быть подклассом или экземпляром person? Потому что это совсем не то, что вы написали.

4. Как указывали другие, вы упускаете различные вещи. Кроме того, в SO это считается «плохим вопросом»; мы вроде как предпочитаем конкретные вопросы о том, как использовать язык или технологию, в отличие от «Что не так в этом коде?» (в чем заключается ваш вопрос). Однако, я думаю, для вас важнее изучить Python, чем то, как сформулировать «хороший» вопрос SO, поэтому я предоставил ответ. В будущем было бы полезно, если бы вы провели еще немного исследований и показали, где вы ранее обращались за помощью, прежде чем публиковать подобный вопрос. 🙂

Ответ №1:

Вы упускаете довольно много вещей, но я вам помогу!

Ваша __init__ функция ничего не делает. Давайте приведем некоторые базовые статистические данные. Я скажу, что скорость и работоспособность a Player по умолчанию будут равны 10 и 100 соответственно. Затем мы создадим Berserker подкласс Player (я думаю, это то, к чему вы стремились?). И, наконец, я приведу Player метод, который позволит вам получить выходные данные в формате строки для своих значений.

Во-первых, новый Player :

 class Player:
    def __init__(self, speed=10, health=100):
        self.speed = speed
        self.health = health

    def __str__(self):
        return "A player with speed {} and health {}.".format(self.speed, self.health)
  

А теперь о Berserker . Я дам ему базовую скорость 15 и работоспособность 85. (Очевидно, что конкретика зависит от вас!)

 class Berserker(Player):
    def __init__(self):
        super().__init__(speed=15, health=85)
  

Наконец, мы можем создать их и распечатать значение. Я сделаю пару разных версий, чтобы вы могли увидеть, как это работает. (И для этого я буду использовать обычный интерпретатор Python).

 >>> p1 = Player()
>>> p2 = Player(7, 120)
>>> b = Berserker()
>>> print(p1)
A player with speed 10 and health 100.
>>> print(p2)
A player with speed 7 and health 120.
>>> print(b)
A player with speed 15 and health 85.
  

Надеюсь, это даст вам хорошее начало!

Ответ №2:

Вы допустили там кучу ошибок :

  • Сделайте отступ в своем методе Berserker, чтобы он был частью класса
  • Назначение в python выполняется с помощью «=», а не с помощью «==» (как и в большинстве языков программирования на самом деле)
  • Укажите начальные значения speed и hp или вообще не помещайте их в конструктор, в python переменные создаются, когда им присваивается значение.
  • Сделайте так, чтобы ваш метод Berserker возвращал строку, чтобы можно было ее распечатать
  • Создайте экземпляр вашего класса

рабочая версия вашего кода должна быть такой :

 class Player:
    def __init__(self):
        self.speed = 0
        self.hp = 0
    def Berserker(self):
        self.speed = 12
        self.hp = 6
        return "speed {} hp  {}".format(self.speed,self.hp) 
m = Player()
print("Berserkers stats are: "   m.Berserker())
  

Теперь это рабочая версия, но она все еще плохо разработана, ИМО, это лучше :

 class Player:
    def __init__(self):
        self.speed = 0
        self.hp = 0
    def Berserker(self):
        self.speed = 12
        self.hp = 6
    def __str__(self):
        return "speed {} hp  {}".format(self.speed,self.hp) 
m = Player()
m.Berserker()
print(m)