отражение Python, чтобы найти объект ссылки - PullRequest
0 голосов
/ 14 февраля 2012

Если у меня есть следующий код

 class One:
   scope = 'first_scope'

 class Two:
   scope = 'second_scope'
   contained_object = One()

Могу ли я получить ссылку на contained_object, чтобы определить посредством отражения, имеют ли он и объект, ссылающийся на него, одинаковые scope?

Спасибо

РЕДАКТИРОВАТЬ: Извинения, если вопрос был неясен, я не совсем уверен в терминологии Python, как его задать. Я придумал что-то вроде образца

Примером может быть

 def sample(input):
     #code in here to find out if input.scope
     # matches a.scope without having a reference to it

 a = Two()
 a.scope = 'first scope'
 a.contained_object.scope = 'will not match'
 sample(a.contained_object)

Ответы [ 2 ]

5 голосов
/ 14 февраля 2012

Ваш вопрос неясен.Если вы имеете в виду, что находитесь в контексте, в котором существуют переменные contained_object и scope, а contained_object содержит объект со свойством scope, тогда да, конечно, вы можете.

Если вы имеете в виду, что у вас просто есть объект типа One, и вы хотите найти ссылки на него, вы можете использовать gc.get_referrers (http://docs.python.org/library/gc.html#gc.get_referrers)

2 голосов
/ 14 февраля 2012

Это выполнимо, вы можете сделать что-то вроде:

import gc

    class A(object):
        scope = 'a'

    class B(object):
        scope = 'b'
        contained = A()

    b = B()

    print gc.get_referrers(b.contained)[0]['scope']

Однако есть еще две проблемы: 1. Почему вы хотите сделать это в первую очередь? У меня очень плохое предчувствие по этому поводу, если у вас нет веских причин, иначе я никогда не предложу вам сделать это. 2. Вам нужно выяснить, как правильно выбрать объект, когда у него есть несколько рефереров - get_referrers() вернуть список диктовок, представляющих все объекты, ссылающиеся на данный.

Вам нужно описать свой вопрос более конкретно, чтобы получить лучший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...