Python - Могу ли я получить доступ к объекту, который мне звонит? - PullRequest
3 голосов
/ 05 марта 2010

Если у меня есть это:

class A:
    def callFunction(self, obj):
        obj.otherFunction()

class B:
    def callFunction(self, obj):
        obj.otherFunction()

class C:
    def otherFunction(self):
        # here I wan't to have acces to the instance of A or B who call me.

...

# in main or other object (not matter where)
a = A()
b = B()
c = C()
a.callFunction(c) # How 'c' know that is called by an instance of A...
b.callFunction(c) # ... or B

Несмотря на дизайн или другие проблемы, это всего лишь вопрос пытливого ума.

Примечание: это должно быть сделано без изменения otherFunction подпись

Ответы [ 3 ]

11 голосов
/ 05 марта 2010

Если это для целей отладки, вы можете использовать inspect.currentframe ():

import inspect

class C:
    def otherFunction(self):
        print inspect.currentframe().f_back.f_locals

Вот вывод:

>>> A().callFunction(C())
{'self': <__main__.A instance at 0x96b4fec>, 'obj': <__main__.C instance at 0x951ef2c>}
3 голосов
/ 05 марта 2010

Вот быстрый взлом, получить стек и из последнего кадра получить локальные данные для доступа к себе

class A:
    def callFunction(self, obj):
        obj.otherFunction()

class B:
    def callFunction(self, obj):
        obj.otherFunction()

import inspect

class C:
    def otherFunction(self):
        lastFrame = inspect.stack()[1][0]
        print lastFrame.f_locals['self'], "called me :)"

c = C()

A().callFunction(c)
B().callFunction(c)

вывод:

<__main__.A instance at 0x00C1CAA8> called me :)
<__main__.B instance at 0x00C1CAA8> called me :)
1 голос
/ 05 марта 2010

Проверьте стек с модулем проверки с inspect.stack(). Затем вы можете получить экземпляр от каждого элемента в списке с помощью f_locals['self']

...