после запуска программы появляется ошибка

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

→ Ссылка