Как я интроспективно просматриваю экземпляр 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
Как я интроспективно просматриваю экземпляр 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
В общем случае мы не хотим, чтобы func
имел доступ к вызывающему экземпляру A
, потому что это прерывает encapsulation. Внутри 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()
Вывод:
<__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
Я согласен с Benjamin - передайте его b.func() в качестве аргумента и не исследуйте его!!!!
Если ваша жизнь действительно зависит от этого, я думаю, вы можете вывести ответ из этого ответа.