@mirindanda

Наследование и переопределение, как быть?

Я написал небольшой код, который просит у пользователей слова и то слово, что короче, выигрывает. Теперь хочу добавить тоже самое, только выигрывать должно самое длинное слово, только наследую части от уже готового кода.
И теперь пытаюсь понять как с помощью наследования и переопределения, красиво и правильно написать, с точки зрения ООП это.

import random

class Sanapeli():
    def __init__(self, kierrokset: int):
        self.voitot1 = 0
        self.voitot2 = 0
        self.kierrokset = kierrokset

    def kierroksen_voittaja(self, pelaaja1_sana: str, pelaaja2_sana: str):
        # arvotaan voittaja
        return random.randint(1, 2)

    def pelaa(self):
        print("Sanapeli:")
        for i in range(1, self.kierrokset+1):
            print(f"kierros {i}")
            vastaus1 = input("pelaaja1: ")
            vastaus2 = input("pelaaja2: ")

            if self.kierroksen_voittaja(vastaus1, vastaus2) == 1:
                self.voitot1 += 1
                print("pelaaja 1 voitti")
            elif self.kierroksen_voittaja(vastaus1, vastaus2) == 2:
                self.voitot2 += 1
                print("pelaaja 2 voitti")
            else:
                pass # tasapeli

        print("peli päättyi, voitot:")
        print(f"pelaaja 1: {self.voitot1}")
        print(f"pelaaja 2: {self.voitot2}")

p = Sanapeli(3)
p.pelaa()


Я правильно понимаю, что должен создать новый класс, который будет вызывать методы от уже написанного кода?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 2
lxstvayne
@lxstvayne
Люблю Python
У тебя победа игрока определяется по какому-то правилу. Я не знаю зачем постоянно логику игры переписывать, если можно переписать свою функцию-правило. Я бы написал абстрактный класс Comparator, у которого есть метод compare с 2 параметрами(словами), также абстрактный. И от него бы унаследовал следующие классы, уже твои правила для игры, как сравнивать слова. И в твой класс Game, где определена логика игры, я бы передавал правила сравнения слов и всё. Так тебе не придётся менять логику кода, а просто писать свои правила.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Выше LXSTVAYNE тебе хороший совет дал, а я напишу кодом.
Описываешь базовый класс и наследуешься от него:
class WordComparator:
    def compare(self, word1: str, word2: str) -> int:
        "Вернет -1 если первое слово лучше, 1 если второе слово лучше, 0 если они одинаково хороши"
        raise NotImplementedError #реализации у нас нет

class LongestWordWins(WordComparator):
    def compare(self, word1: str, word2: str) -> int:
        l1, l2 = len(word1), len(word2)
        if l1 > l2:
            return -1
        elif l1 < l2:
            return 1
        else:
            return 0

class ShortestWordWins(WordComparator):
    def compare(self, word1: str, word2: str) -> int:
        l1, l2 = len(word1), len(word2)
        if l1 > l2:
            return 1
        elif l1 < l2:
            return -1
        else:
            return 0

Затем ты передаёшь в класс, реализующий игровую логику, экземпляр одного из двух классов, и обращаешься к его методу compare() когда тебе надо сравнить два слова.
Это называется паттерн "стратегия".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы