2024-05-14 06:30:46 发布
网友
如何从b.func()内部反思A的实例(即A的实例的self):
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
一般来说,我们不希望func能够访问A的调用实例,因为这样会中断encapsulation。在b.func中,您应该可以访问传递的任何参数和kwargs、实例的状态/属性b(通过这里的self),以及任何挂在周围的全局变量。
func
b.func
b
如果要了解调用对象,有效的方法是:
然而,在排除了免责声明的情况下,仍然需要知道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()
输出:
<__main__.A instance at 0x15bd9e0>
这可能是一个有用的技巧,了解调试代码有时。但是,如果B.func实际上出于任何原因需要使用A,那么访问这样的堆栈帧将不是一个明智的设计决策。
B.func
作为参数传递给b.func()。
通过重构代码来实现
class A(): def go(self): b = B(self) b.func() class B(): def __init__(self, a): self.a = a def func(self): # Use self.a
或者
class A(): def go(self): b = B() b.func(self) class B(): def func(self, a): # a
一般来说,我们不希望
func
能够访问A
的调用实例,因为这样会中断encapsulation。在b.func
中,您应该可以访问传递的任何参数和kwargs、实例的状态/属性b
(通过这里的self
),以及任何挂在周围的全局变量。如果要了解调用对象,有效的方法是:
func
之前,将句柄显式地添加到b
实例中,然后通过self
访问该句柄。然而,在排除了免责声明的情况下,仍然需要知道python的内省功能在某些情况下足以访问调用方模块。在CPython实现中,下面是如何在不更改接口的情况下访问调用的
A
实例:输出:
这可能是一个有用的技巧,了解调试代码有时。但是,如果
B.func
实际上出于任何原因需要使用A
,那么访问这样的堆栈帧将不是一个明智的设计决策。作为参数传递给
b.func()
。通过重构代码来实现
或者
相关问题 更多 >
编程相关推荐