ready_or_not
звонки self.display_menu()
:
def ready_or_not(self):
# see if user types 1 or 2 with try & except
try:
# ask user if they are ready
self.ready = int(input("Are you ready to play? Type 1 for yes, 2 for no"))
self.display_menu()
except ValueError:
print("You did not type 1 or 2, please try again!")
check_choice
также вызывают self.display_menu()
как минимум один раз и дважды, если вы в первый раз что-нибудь наберите, кроме 1
:
def check_choice(self):
if self.display_menu() == 1:
self.set_name()
elif self.display_menu() == 2:
self.set_names()
else:
print("Exiting....")
print("Goodbye!")
sys.exit(0)
Ваш код верхнего уровня вызывает ready_or_not()
для одного экземпляра меню:
m = menu("yes")
m.ready_or_not()
… и check_choice()
для другого:
p = player("yes", "test")
p.check_choice()
Итак, ваша программаотображает меню дважды, а затем в третий раз, если вы вводите что-либо, кроме 1
.
Если вы не хотите, чтобы меню отображалось два или три раза, не вызывайте метод два или три раза.
Если вы хотите отобразить меню только один раз и запомнить выбор, вместо того, чтобы отображать его два или три раза, вам нужно использовать атрибут self.ready
, который вы создаете в ready_or_not
, вместоповторного вызова метода.
Однако, это все равно не будет работать как есть, потому что дизайн вашего класса странный.Вы сделали два отдельных экземпляра, m
и p
, каждый из которых имеет свои независимые атрибуты.Я не уверен, почему player
наследуется от menu
во-первых (или почему display_menu
является @classmethod
, или почему он вызывает свой параметр self
вместо cls
, если он один, иразличные другие вещи), но, учитывая, что player
является menu
в вашем дизайне, вы, вероятно, просто хотите один player
экземпляр, например:
p = player("yes", "test")
p.ready_or_not()
p.check_choice()
И затем вы можетеизменить check_choice
вот так:
def check_choice(self):
if self.choice == 1:
self.set_name()
elif self.choice == 2:
self.set_names()
else:
print("Exiting....")
print("Goodbye!")
sys.exit(0)