2012-04-27 2 views
0

Предположим, что этот пример: два класса братьев и сестер, где один загружает другой класс в качестве нового атрибута, а затем я хочу использовать этот атрибут из основного класса внутри брака.Обратная интроспекция Python

a = 2 
class AN(object): 
    def __init__(self,a): 
     self.aplus = a + 2 
     self.BECls = BE(a) 


class BE(object): 
    def __init__(self,a): 
     print a 

    def get_aplus(self): 
     ???? 

c = AN(a) 

и я хотел бы сделать:

c.BECls.get_aplus() 

и это возвращает что-то вроде self.self.aplus (метафорически), это было бы 4

Возобновление: получить APlus атрибут из AN внутри класса BE, не объявляя в качестве аргументов, но делая «обратную интроспекцию», если это возможно, рассмотрение переменной «a» должно быть уже загружено через AN.

Извините, если я не прояснился, но я попытался упростить то, что происходит с моим настоящим кодом.

Я предполагаю, что проблема может быть той техникой, которую я использую в классах. Но не уверен, что и как сделать лучше.

Благодаря

+0

Почему ты не можешь просто дать 'BE' объекта ссылку на соответствующий' AN'? –

+0

На самом деле это то, что мне нравится делать, но как? Cheers – AndreLobato

+0

Я не могу дать BE объект (an_obj = AN (self.a)), потому что он попадает в бесконечный цикл, пытаясь загружать себя снова и снова, поднимая RunTimeError. – AndreLobato

ответ

2

вопрос OP в:

получить APlus атрибут из внутреннего BE класса, без объявления, как аргументы, но делать «Обратный самоанализа», если это возможно, учитывая «а 'переменная должна быть уже загружена через AN.

Ближайшая вещь, которую мы должны «обратить вспять интроспекцию», - это поиск по gc.getreferrers().

Тем не менее, было бы лучше просто сделать отношения явно

class AN(object): 
    def __init__(self,a): 
     self.aplus = a + 2 
     self.BECls = BE(self, a) 

class BE(object): 
    def __init__(self, an_obj, a): 
     self.an_obj = an_obj 
     print a 

    def get_aplus(self): 
     return self.an_obj.aplus 

if __name__ == '__main__': 
    a = 2 
    c = AN(a) 
    print c.BECls.get_aplus()  # this returns 4 
+0

Я думаю, что это был бы один из способов, чтобы справиться с этим, но в моем реальном случае мне очень нравится использовать любой аргумент alredy, переданный в основной класс нагрузки, иначе мне нужно было бы передать несколько объектов другим нескольким загруженным классам, и это чувствует мне нравится делать слишком много повторений. Этот путь, идущий назад, кажется более логичным. Я попытаюсь исследовать getreferrers и посмотреть, не работает ли это. Спасибо, ответ пришел неожиданно быстро. – AndreLobato

+0

Я попытался использовать функции gc, но ни один из них не дал мне тот объект, который мне нужен. Привет всем. Надеюсь найти какой-то умный выход из этой проблемы. Все еще не сумасшедший. Этот ответ является самым близким решением. – AndreLobato

Смежные вопросы