使用方法作为字典值

时间:2013-07-11 02:12:12

标签: python python-2.7

class Inventory(object):
    def __init__(self):
        self.inventory = {
            'cash': 500,
            'paycheck': 1,
            'savings': 1000,
            'current_car': 0,
            'possible_cars': ['Chevy', 'Honda', 'BMW'],
            'car_cost': [0, 100, 200],
            'current_house': 0,
            'possible_houses': ['apartment','townhouse','suite'],
            'house_cost': [0, 150, 300],
            'status': self.status()
                  }

    def status(self):
        while self.inventory['cash'] + self.inventory['savings'] > 0:
            return True

我目前正在练习练习45中的“学习Python困难之路”。我创建了一个列出与游戏相关的项目的类,我已将这些键和值存储在我的<字典下strong> init 方法。我遇到麻烦的地方在我的最后一把钥匙内,而且它的价值 - “状态”键。

我希望这个值要做的是引用我的状态方法,只要我的玩家有一笔正数金额我已设置为返回true(我的游戏的其他部分将参考.inventory ['status'在执行之前检查它的真相。现在我已经快速完成了两行概念证明代码,以验证是否可以使用函数作为一个值 - 我在哪里挂了如何实现这一点一个类,特别是当我的词典在 init 中时。

我的错误:

Traceback (most recent call last):
  File "ex45file1.py", line 151, in <module>
    my_inv  = Inventory() #TEST
  File "ex45file1.py", line 80, in __init__
    'status': status()
NameError: global name 'status' is not defined

我在哪里错了?

3 个答案:

答案 0 :(得分:4)

首先,这不是您的代码产生的错误。在您的版本中,您有'status': status(),但在SO上您写了'status': self.status()。在任何情况下,如果你修复了你仍然有问题,

AttributeError: 'Inventory' object has no attribute 'inventory'

您收到该错误的原因是因为Python正在定义您的inventory属性,但您致电status 必须引用inventory给出一个返回值。

您甚至不想调用该函数并将返回值保存在字典中,因为这不允许您动态使用它。您应该更改它,以便不调用,只需保存引用。

class Inventory(object):
    def __init__(self):
        self.inventory = {
            'cash': 500,
            'paycheck': 1,
            'savings': 1000,
            'current_car': 0,
            'possible_cars': ['Chevy', 'Honda', 'BMW'],
            'car_cost': [0, 100, 200],
            'current_house': 0,
            'possible_houses': ['apartment','townhouse','suite'],
            'house_cost': [0, 150, 300],
            'status': self.status  # <--- don't use parens ()
        }

只需调用方法,

>>> my_inventory = Inventory()
>>> my_inventory.inventory['status']()
True

答案 1 :(得分:1)

我有一个不同的错误,但我相信解决方案是一样的:

class Inventory(object):
    def __init__(self):
        self.inventory = {
            'cash': 500,
            'paycheck': 1,
            'savings': 1000,
            'current_car': 0,
            'possible_cars': ['Chevy', 'Honda', 'BMW'],
            'car_cost': [0, 100, 200],
            'current_house': 0,
            'possible_houses': ['apartment','townhouse','suite'],
            'house_cost': [0, 150, 300],
                  }
        self.inventory['status'] = self.status()

    def status(self):
        while self.inventory['cash'] + self.inventory['savings'] > 0:
            return True

我的错误是抱怨未在状态()中定义库存。

答案 2 :(得分:0)

我试过复制&amp;将代码粘贴到我的Python解释器中,我得到一个不同的错误:

>>> inv = new Inventory()
  File "<stdin>", line 1
    inv = new Inventory()
                      ^
SyntaxError: invalid syntax
>>> inv = Inventory()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 13, in __init__
  File "<stdin>", line 16, in status
AttributeError: 'Inventory' object has no attribute 'inventory'

问题是您在inventorystatus之间存在循环依赖关系。您使用status来定义inventory,但status需要先阅读inventory才能返回...查看问题?