после запуска программы появляется ошибка
main.py
from variants import Variants
from player import Player
bot = Player
alex = Player(Variants.SCISSORS, 'Alex')
print(bot.whoWins(bot, alex))
player.py
from variants import Variants
class Player:
def __init__(self, choise=Variants.ROCK, name='bot'):
self.choise = choise
self.name = name
def whoWins(self, player1, player2):
if (player1 == player2):
print("draw")
if player1 > player2:
print('player1 wins')
if player1 < player2:
print('player2 wins')
variants.py
from enum import Enum
class Variants(Enum):
ROCK = 1,
PAPER = 2,
SCISSORS = 3
Ошибка:
Ошибка: Traceback (most recent call last):
File "D:\shlak\Zadanie k 2 modulu\main.py", line 8, in <module>
print(bot.whoWins(bot, alex))
TypeError: Player.whoWins() missing 1 required positional argument: 'player2'
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
В коде много проблем.
Основная - чтобы классы можно было сравнивать, через равно/больше/меньше, у них должны быть определены магические методы __eq__, __gt__, __lt__ (в идеале еще нужно создать методы для <=, >=).
Я добавлю в Variants методы __eq__, __lt__, остальные создаются с помощью декоратора total_ordering.
Дальше в методе whoWins сравниваю не классы Player, а их выбор (поля choice).
По поводу декоратора total_ordering см. документацию
Про магические методы в целом можно почитать в статье на Хабре:
Руководство по магическим методам в Питоне
from enum import Enum
from functools import total_ordering
# Добавляем два метода для сравнения - на раверство и на "меньше",
# остальное создатся с помощью декоратора total_ordering
@total_ordering
class Variants(Enum):
ROCK = 1 # Не должно быть запятой (из-за нее записывается tuple из одного элемента (1,) вместо просто 1)
PAPER = 2 # Не должно быть запятой
SCISSORS = 3
def __eq__(self, other):
return self.value == other.value
def __lt__(self, other):
# Если разница числовых значения больше 1, значит это ROCK и SCISSORS
if abs(self.value - other.value) > 1:
# Два "крайних" случая (ROCK и SCISSORS) нужно сравнивать наоборот,
# Т.е. ROCK должно стать > SCISSORS, хотя 1 < 3
return self.value > other.value
else:
return self.value < other.value
# Проверяем, что операторы сравнения работает правильно
assert Variants.ROCK < Variants.PAPER
assert Variants.PAPER > Variants.ROCK
assert Variants.SCISSORS < Variants.ROCK
assert Variants.ROCK > Variants.SCISSORS
assert Variants.PAPER < Variants.SCISSORS
assert Variants.SCISSORS > Variants.PAPER
class Player:
def __init__(self, choice=Variants.ROCK, name='bot'):
self.choice = choice
self.name = name
# Добавляем декоратор staticmethod, чтобы можно было вызывать метод от класса, и не указывать аргумент self
@staticmethod
def whoWins(player1, player2):
# Сравниваем не игроков, а их выбор
if player1.choice == player2.choice:
# Если нужно вывести результат функции через print, то результат нужно из нее возвращать через return
return "draw"
elif player1.choice > player2.choice:
return f"{player1.name} wins" # Возвращаем итог с именем игрока
else:
return f"{player2.name} wins"
bot = Player() # Не было скобок, из-за этого не создавался объект, а просто записывался класс Player
alex = Player(Variants.SCISSORS, 'Alex')
print(Player.whoWins(bot, alex))
Вывод: bot wins