python - 范围问题,可以访问对象属性但不能访问对象实例
问题描述
我正在创建一个文本冒险引擎,引擎本身运行良好,但我正在尝试通过回调为游戏创建者实现自定义事件。我有一个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
- 我的回调函数是在创建关键对象之后编写的
- 在编写函数后,我的回调被分配给一个事件
- 我可以访问对象属性但不能访问对象本身。
一切似乎都井然有序。那么问题是什么?如何编写可以访问我创建的对象实例的回调函数?
解决方案
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' ]
...
推荐阅读
- javascript - c# - 从代码隐藏中添加 javascript 函数
- php - 在 Bash 中使用 which php 有什么用?
- python - 类型错误:is_valid() 缺少 1 个必需的位置参数:'self'
- mongodb - MongoDB - 如何过滤包含键的文档
- wordpress - 在使用木材的第一页之后每页使用不同的帖子?
- graphql - 如何指定采用多种类型的 graphql 类型?
- c# - 编写实用程序类时异常处理的最佳实践 c#
- python - Keras Convolution1D 输入形状
- android - 如何从activivty调用服务中的进度对话框
- javascript - 当用户开始输入时如何显示输入的最大长度?