【问题标题】:What arguments to give method names in a dict in __init__?在 __init__ 中的 dict 中给出方法名称的参数是什么?
【发布时间】:2015-01-25 14:11:41
【问题描述】:

我正在学习 Python the Hard Way 中的练习 43,尝试填写作者的骨架 OOP 代码来制作一个有效的“冒险”类型游戏。在本文的最后几个练习之前,我从未做过任何类型的 OOP,所以很难做到。

我在一个类中使用__init__ 通过存储键引用的调用(经典“让你拥有case 语句”用于 Python),但这些方法需要参数(以跟踪已经看到的房间、携带库存等)——当我为参数包含变量时,我总是会得到一个错误,即“[name] 在赋值之前引用"或类似的。如果我提供空白或常量/文字参数,我不会收到该错误,但显然如果参数不是变量,我以后的调用将无法正常工作。

如果我将 dict def 移动到 Engine 类的主要方法中,一切似乎都很好,但是我必须在类的每个方法中再次定义整个 dict,对吗?这是我正在处理的课程,在主要方法中使用字典而不是 __init__ - 我怎样才能将这本字典放入 __init__ 并让它工作?

class Engine (object):

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

  def drop_item(self, c_list, inv, log):
    pass

  def goto(self, c_list, inv, log):
    print c_list
    pass

  def take_item(self, c_list, inv, log):
    pass

  def inventory(self, c_list, inv, log):
    pass

  def show_items(self, c_list, inv, log):
    pass

  def set_bomb(self, c_list, inv, log):
    pass

  def talk_to(self, c_list, inv, log):
    pass

  def play(self):
    next_move = []
    stuff = []
    seen = []

    self.act = {
      'drop'        :self.drop_item(next_move, stuff, seen),
      'enter'       :self.goto(next_move, stuff, seen),
      'get'         :self.take_item(next_move, stuff, seen),
      'go'          :self.goto(next_move, stuff, seen),
      'inventory'   :self.inventory(next_move, stuff, seen),
      'leave'       :self.goto(next_move, stuff, seen),
      'look'        :self.show_items(next_move, stuff, seen),
      'run'         :self.goto(next_move, stuff, seen),
      'start'       :self.set_bomb(next_move, stuff, seen),
      'take'        :self.take_item(next_move, stuff, seen),
      'tell'        :self.talk_to(next_move, stuff, seen),
    }

    self.obj = {
      'armory'  :'',
      'blaster' :'',
      'bomb'    :'',
      'bridge'  :'',
      'cabin'   :'',
      'corridor':'',
      'gangway' :'',
      'gothon'  :'',
      'keypad'  :'',
      'pod'     :'',
      }

    self.scene_map.opening_scene()
    entry = UserEntry()

    done = False
    dead = False

    while not done:  
      next_move = entry.get_input()
      entry.obj [next_move (0)] (next_move)`

我正在尝试获得更多类似的东西:

  def __init__(self):
    self.scene_map = scene_map
    self.act = {
      'drop'        :self.drop_item(next_move, stuff, seen),
      'enter'       :self.goto(next_move, stuff, seen),
      'get'         :self.take_item(next_move, stuff, seen),
      'go'          :self.goto(next_move, stuff, seen),
      'inventory'   :self.inventory(next_move, stuff, seen),
      'leave'       :self.goto(next_move, stuff, seen),
      'look'        :self.show_items(next_move, stuff, seen),
      'run'         :self.goto(next_move, stuff, seen),
      'start'       :self.set_bomb(next_move, stuff, seen),
      'take'        :self.take_item(next_move, stuff, seen),
      'tell'        :self.talk_to(next_move, stuff, seen),
    }

    self.obj = {
      'armory'  :'',
      'blaster' :'',
      'bomb'    :'',
      'bridge'  :'',
      'cabin'   :'',
      'corridor':'',
      'gangway' :'',
      'gothon'  :'',
      'keypad'  :'',
      'pod'     :'',
      }

建议?

【问题讨论】:

  • 你希望如何使用self.actself.obj?他们应该怎么做?
  • 目前,这些是供玩家使用的有效命令词列表,附加效果是使用命令词作为self.act中的键让我运行执行该功能的方法 - - 因此,如果玩家输入“get blaster”,我将运行self.take_item,参数将告诉take_item 检查是否有爆能枪,如果有,将其添加到玩家的库存中。
  • 在您的代码示例中,您应该包含您计划对self.actself.obj 执行的操作,即使用它们的代码(即使它还不能工作)。目前尚不清楚您希望 next_movestuffseen 来自哪里。
  • 我试图避免 TL;DR 影响粘贴数百行。这不是我可以减少到最低限度的复制器并仍然避免像你这样的问题的东西。短版:next_move 是用户输入的经过解析/修剪的命令行(应该只是动词和名词,如“启动炸弹”); stuff 是库存列表,seen 是访问位置列表(允许在第一次看到或明确的“查看”命令时给出长描述,在重访时给出更短的描述——如原始“冒险”或“巨大的洞穴”)。

标签: python class python-2.7 dictionary arguments


【解决方案1】:

您正在将调用结果保存到您的字典中的方法。您可能希望在 __init__() 中使用类似的内容来保存对方法的引用:

self.act = {
  'drop'        :self.drop_item,
  'enter'       :self.goto,
  'get'         :self.take_item,
  'go'          :self.goto,
  'inventory'   :self.inventory,
  'leave'       :self.goto,
  'look'        :self.show_items,
  'run'         :self.goto,
  'start'       :self.set_bomb,
  'take'        :self.take_item,
  'tell'        :self.talk_to,
}

即引用方法而不传递参数。然后通过实际调用运行该方法以执行play() 中的操作:

self.act["the action"](next_move, stuff, seen)

【讨论】:

  • 两分钟前,我在另一个问题中发现了相同的信息,但在发布我之前没有找到。很难在几百万个问题中得到很好的搜索...
  • 接着说这非常有效(一旦我杀死了另一个与字典无关的错误)——我在大约十分钟内从错误消息到使用正确的参数运行正确的方法(然后倒在床上,因此跟进缓慢)。
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多