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