Jon*_*han 16 python introspection
我如何A从内部b.func()(即A实例self)内省实例:
class A():
def go(self):
b=B()
b.func()
class B():
def func(self):
# Introspect to find the calling A instance here
Run Code Online (Sandbox Code Playgroud)
wim*_*wim 30
一般来说,我们不希望它func有权访问调用实例,A因为这会破坏封装.在b.func你内部你应该可以访问任何传递的args和kwargs,实例的状态/属性b(通过self这里),以及任何挂起的全局变量.
如果您想了解调用对象,有效的方法是:
b在使用之前的某个时间向调度程序显式添加一个句柄func,然后通过该句柄访问该句柄self. 但是,有了免责声明,仍然值得知道python的内省功能在某些情况下足以访问调用程序模块.在CPython实现中,以下是如何在A不更改接口的情况下访问调用实例:
class A():
def go(self):
b=B()
b.func()
class B():
def func(self):
import inspect
print inspect.currentframe().f_back.f_locals['self']
if __name__ == '__main__':
a = A()
a.go()
Run Code Online (Sandbox Code Playgroud)
输出:
<__main__.A instance at 0x15bd9e0>
Run Code Online (Sandbox Code Playgroud)
这有时可能是了解调试代码的有用技巧.但是,在B.func实际A因任何原因需要使用的情况下,访问这样的堆栈帧并不是一个合理的设计决策.
你把它传递给b.func()一个参数.
| 归档时间: |
|
| 查看次数: |
9734 次 |
| 最近记录: |