首页 > 解决方案 > 范围问题,可以访问对象属性但不能访问对象实例

问题描述

我正在创建一个文本冒险引擎,引擎本身运行良好,但我正在尝试通过回调为游戏创建者实现自定义事件。我有一个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

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

标签: pythonpython-3.x

解决方案


del key意味着不超过或少于“key本地范围中删除名称”。on_door_unlock但是这个符号从来没有被带入build.

许多更好的方法之一是创建一个明确命名的对象注册表,例如作为dict被调用的all_objects. 创建key里面。key通过在函数中按名称引用它来删除它。

ALL_OBJECTS = {}

def build():
    ALL_OBJECTS[ 'copperKey' ] = engine.Item()

    ...

    def on_door_unlock():

        del ALL_OBJECTS[ 'copperKey' ]
        ...

推荐阅读