Antes de entrar en el problema en si, tienes un ciclo infinito:
def method():
option = int(input("type your option :"))
while option <0 or option >6: #̣ opcion es la variable de control del ciclo
#--|
menu() # |-- Nunca se modifica dentro del mismo
#--|
Dicho ésto, menu
es un "atributo de clase" tal como está definido, para acceder a él desde el método de instancia, debes hacerlo tal como está usando la referencia a la clase:
trys.menu()
Además nunca haga ésto:
class trys:
def menu():
print("welcome to your soccer team")
print("1 team trip")
print("2 training")
print("3 football game")
print("4 plan training")
print("5 interview")
print("6 heal lesson")
menu() # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
El cuerpo de una clase se evalúa y ejecuta en tiempo de definición, cuando se ejecuta o importa el módulo, no cuando la clase se instancia. Por lo tanto, cuando importes el módulo que contiene a clase o lo ejecutes aparecerá un bonito menú en stdout sin haber instanciado siquiera la clase, y eso normalmente no lo queremos...
Normalmente los menús y entradas de usuario que se suelen usar para generar objetos de las clases no se colocan dentro de la clase, sino como meras funciones en el modulo, dejando la clase solo para representar el objeto en si.
Si dejas el menú en la clase, lo suyo es posiblemente que lo definas como método estático ya que no maneja ni atributos de clase (método de clase) ni atributos de instancia (método de instancia):
class Trys:
@staticmethod
def menu():
print("welcome to your soccer team")
print("1 team trip")
print("2 training")
print("3 football game")
print("4 plan training")
print("5 interview")
print("6 heal lesson")
def method(self):
option = 0
while not 0 < option < 7:
self.menu()
option = int(input("type your option: "))
if __name__ == "__main__":
p = Trys()
p.method()
Los métodos estáticos en Python son funciones normales que tienen alguna relación lógica con la clase, pero que realmente no son parte esencial de ella ya que no modifican o acceden a atributos de instancia o clase y por tanto no modifican el comportamiento del objeto o clase. Podrían definirse fuera sin problemas pero nos conviene por legibilidad o cualquier otra razón que formen parte de la misma. Se puede acceder a ellos mediante una referencia a la clase o comúnmente mediante una referencia a la instancia (self
en éste caso), pero no reciben como argumento automáticamente ni una referencia a la clase ni a la instancia (métodos de clase y métodos de instancia respectivamente).
Aunque no vendría mal tener en cuenta que los usuarios son "malvados por naturaleza" y tener en cuenta que puede ingresar algo que no sea un entero.
def method(self):
option = 0
while not 0 < option < 7:
self.menu()
try:
option = int(input("type your option: "))
except ValueError:
pass
o directamente quitarse el problema de la conversión de encima y usar cadenas directamente para diferenciar las opciones del menú.
def method(self):
option = ""
while not opción in ('1', '2', '3', '4', '5', '6'):
self.menu()
option = input("type your option: ")
en éste caso valdría también:
def method(self):
option = ''
while not '0' < option < '7':
self.menu()
option = input("type your option: ")
pero no si tienes más de 9 opciones, ya que las cadenas se ordena según orden lexicográfico, por lo que 2 > 10
.
Por último, por convención los nombres de las clases usan siempre CamelCase: