ООП & Синтаксис - Пример 43 - Изучите Python трудным путем - PullRequest
0 голосов
/ 09 мая 2018

Я новичок в кодировании и абсолютный нуб. Мне действительно очень нравилось читать книгу Зеда Шоу «Изучай Python 3 трудным путем» - но когда я добрался до этого упражнения и ООП, внезапно все перестало иметь смысл.

Мне действительно нужна помощь от кого-то более опытного в том, как на самом деле перевести этот код "на английский", чтобы я мог следить за тем, что он делает ... и в идеале выяснить, как писать код, подобный этому.

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

Я включил свои вопросы построчно ... Я думаю, что одна из самых полезных вещей, которые кто-либо может сделать, это пересмотреть синтаксис этого кода со мной. Я пытаюсь думать об этом с точки зрения последовательности: (1) вводится xyz (2) происходит abc (3) возвращается efg .... но для меня слишком много вложенных отношений, чтобы разобрать все без чья-то помощь, кто более опытен.

class Scene(object):

  def enter(self):
      print("This scene is not yet configured.")
      print("Subclass it and implement enter().")
      exit(1)

В1: Эти строки здесь только для целей отладки, верно?

class Engine(object):

  def __init__(self, scene_map):
      self.scene_map = scene_map

Q2: Моя проблема начинается здесь с ООП. Как я могу интуитивно понять «init» и как его использовать? Я думаю 'self' = 'a_game' ... но что эта строка self.scene_map = scene_map вообще делает в контексте остальной части кода?

  def play(self):
      current_scene = self.scene_map.opening_scene()
      last_scene = self.scene_map.next_scene('finished')

В3: в этих двух строках много всего происходит (класс Map также задействован) ... что это на самом деле говорит?

      while current_scene != last_scene:
          next_scene_name = current_scene.enter()
          current_scene = self.scene_map.next_scene(next_scene_name)

Q4: я получаю часть "while" этого ... но потом меня смущают следующие две строки "next_scene_name = ..." и "current_scene = ..." Как строки из функции play, Я хотел бы знать, как это читает опытный программист.

      current_scene.enter()

Q5: Я полагаю, что это сердце кода, который инициирует действие ... но как это взаимодействует со значениями, которые возвращаются в конце каждой сцены (которые, вероятно, ведут к следующей сцене)? Каждая сцена просто заканчивается «return 'xyz'» - я не понимаю, как этого достаточно.

class CentralCorridor(Scene):

  def enter(self):
      # print story-line here...
      action = input("> ")

      if action == "xyz":
          return 'laser_weapon_armory'
      # rest omitted...

class LaserWeaponArmory(Scene):

  def enter(self):
      # action & choices go here...

  return 'xyz'

class Map(object):

  scenes = {
  'central_corridor': CentralCorridor(),
  'laser_weapon_armory': LaserWeaponArmory(),
  # more...
  }

  def __init__(self, start_scene):
      self.start_scene = start_scene

См. Q2 ...

  def next_scene(self, scene_name):
      val = Map.scenes.get(scene_name)
      return val

В6: Я понимаю, что когда эта функция вызывается, она возвращает значение ключа из сцены ['scene_name'] - но что на самом деле вызывает эта функция next_scene? И когда возвращается «val», куда он идет?

  def opening_scene(self):
      return self.next_scene(self.start_scene)

Q7: так как a_map определен как класс Map с параметром 'central_corridor', я получаю, что это говорит "return self.next_scene ('central_corridor')" "... но после этого я снова потерялся! Что это на самом деле переводит?

a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()

Эти последние строки я понимаю ... но, опять же, как только я начинаю вставлять их обратно в остальную часть кода, я довольно быстро теряюсь.

Вот и все! Я знаю, что это много - и я понимаю, что если люди захотят понизить меня за то, что я нуб, но я действительно хочу понять ООП, и мне было довольно сложно понять это.

1 Ответ

0 голосов
/ 09 мая 2018

Даже у меня была такая же проблема, когда я изучал OOPS из Изучите Python с трудом , поэтому я бы посоветовал вам изучить OOPS из Interactive Python .

http://interactivepython.org/runestone/static/pythonds/Introduction/ObjectOrientedProgramminginPythonDefiningClasses.html

Как только вы ознакомитесь с концепциями OOPS, вы можете продолжить изучение Python в трудном положении. Я надеюсь, что это поможет вам. Это не ответ на ваш вопрос, но у меня недостаточно представителей, чтобы комментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...