范围问题,可以访问对象属性,但不能访问对象实例

时间:2019-01-11 16:55:18

标签: python python-3.x

我正在创建一个文本冒险引擎,该引擎本身运行良好,但是我试图通过回调为游戏创建者实现自定义事件。我有一个main.py文件,该文件实现了所有游戏对象并构建了游戏。问题是实例化实例后,似乎无法访问它们。看一下这个伪示例代码,

import engine

def build():
    # create new item objects
    key = engine.Item()
    door = engine.Item(a = 0)

    # set state of door
    door.locked(requirement = key)

    # CALLBACK FUNCTION
    def on_door_unlock():
        # ACCESSING THE ATTRIBUTE `a` IN `door` WORKS FINE
        door.a = 1
        # ACCESSING THE `key` OBJECT THROWS UnboundLocalError
        del key

    # assign callback to unlock event
    door.on_unlock(on_door_unlock)

build()
engine.run()

我的文件显然比此文件大得多,但它非常简单,并且此代码隔离了我的问题。我可以访问任何对象的属性,但是当我尝试在对象本身上使用del关键字时,我得到UnboundLocalError: local variable 'key' referenced before assignment

  • 我的回调函数是在创建键对象之后编写的
  • 编写函数后,我的回调将分配给一个事件
  • 我可以访问对象属性,但不能访问对象本身。

一切似乎都井井有条。那是什么问题呢? 我该如何编写可以访问我创建的对象实例的回调函数?

1 个答案:

答案 0 :(得分:1)

del key的含义不超过“从 local 范围中删除名称key”。但是,从未将此符号带入on_door_unlock的本地范围,即使将其删除,也不会对build的范围产生任何影响。

许多更好的方法之一是创建一个显式命名的对象注册表,例如,创建为名为dict的{​​{1}}。在其中创建all_objects。通过在函数中按名称引用将其key删除。

key