@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()


Я правильно понимаю, что должен создать новый класс, который будет вызывать методы от уже написанного кода?
  • Вопрос задан
  • 60 просмотров
Решения вопроса 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() когда тебе надо сравнить два слова.
Это называется паттерн "стратегия".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы