Python获取外层函数所有属性:为何dir(outer)未列出inner函数
问题解答
1. dir(outer)查询不到inner函数的原因
inner是outer的内部局部函数,属于outer的函数局部作用域成员:
- 默认情况下,
inner仅在outer被调用时才会被临时创建,函数执行结束后如果没有被外部引用就会被回收,全程不会自动绑定到outer函数本身作为属性存在。 dir()函数返回的是目标对象的所有内置属性、以及手动绑定到对象上的自定义属性,未手动绑定的局部作用域成员不会出现在返回结果里。
2. 将inner作为outer属性访问的实现方法
方法1:内部绑定(适配闭包场景)
在outer函数体内定义完inner后,手动将inner赋值为outer的属性即可,该方式保留了inner作为闭包访问outer局部变量的特性,需要至少调用一次outer才会触发绑定生效:
def outer(msg): def inner(): print(msg) # 手动绑定inner到outer的属性 outer.inner = inner return inner # 调用一次outer完成绑定 returned_func = outer("Hello") # 此时可直接访问outer.inner print(outer.inner) # dir(outer)返回结果会包含inner属性
⚠️ 注意:每次调用outer都会覆盖outer.inner的取值,最终存储的是最后一次调用outer时生成的inner实例。
方法2:外部绑定(无需调用outer即可生效)
如果inner不需要依赖outer的局部变量/入参,可以直接在全局作用域完成inner的定义和绑定,无需调用outer就能直接访问:
# 全局定义inner def inner(): print("Hello") def outer(msg): return inner # 直接在外部绑定为outer的属性 outer.inner = inner # 无需调用outer即可直接访问 print(outer.inner)
内容的提问来源于stack exchange,提问作者DSH
相关产品推荐
相关产品推荐

