内省呼叫对象

2024-05-14 06:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从b.func()内部反思A的实例(即A的实例的self):

class A():
    def go(self):
        b=B()
        b.func()

class B():
    def func(self):
        # Introspect to find the calling A instance here

Tags: theto实例instanceselfgoheredef
3条回答

一般来说,我们不希望func能够访问A的调用实例,因为这样会中断encapsulation。在b.func中,您应该可以访问传递的任何参数和kwargs、实例的状态/属性b(通过这里的self),以及任何挂在周围的全局变量。

如果要了解调用对象,有效的方法是:

  1. 将调用对象作为参数传递给函数
  2. 在使用func之前,将句柄显式地添加到b实例中,然后通过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()

输出:

<__main__.A instance at 0x15bd9e0>

这可能是一个有用的技巧,了解调试代码有时。但是,如果B.func实际上出于任何原因需要使用A,那么访问这样的堆栈帧将不是一个明智的设计决策。

作为参数传递给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

相关问题 更多 >