2013-03-27 1 views
1

У меня возникла следующая проблема в Python. Предположим, у вас есть 3 файла:Использование объекта импортированного класса как глобальной переменной другого класса в Python

1) a.py (определяет класс A):

class A: 
    def a_method(self): 
    print "global var experiment" 

2) b.py (определяет класс B, который использует метод глобального объекта класса А):

class B: 
    def b_method(self): 
    print "calling a_method() from B..." 
     obj_a.a_method() 

3) global_ex.py:

from a import A 

obj_a=A()  
obj_a.a_method() 

from b import B 

obj_b = B() 
obj_b.b_method() 

Когда я бегу global_ex.py я получаю ошибку:

NameError: global name 'obj_a' is not defined 

Если вместо импорта a.py и b.py я скопирую их в файл global_ex.py, он отлично работает.

В чем проблема? Как правило, что является лучшим способом использования методов одного объекта в другом объекте?

Заранее спасибо.

+0

хорошо, 'obj_a' не определен в глобальной области видимости' b.py' - будет вам нравится интерпретатор для копирования-вставки текста импортированного модуля вместо использования скомпилированного байт-кода? – Aprillion

ответ

1

EDITED:

Try:

from a import A 

class B(): 

    def __init__(self): 
     self.a_obj = A() 

    def b_method(self): 
     print "calling a_method() from B..." 
     self.a_obj.a_method() 

Или:

class B(): 

    def __init__(self, a_inst): 
     self.a_inst = a_inst 

    def b_method(self): 
     print "calling a_method() from B..." 
     self.a_inst.a_method() 
+0

Спасибо, однако, я привел здесь простой пример. В моем реальном случае класс А содержит другие члены и методы, которые должны быть доступны другими классами. Сейчас я думаю, что лучший способ - передать obj_A как и аргумент b_method. Это должно работать так, не так ли? – jazzblue

+0

@GregoryR - да, это будет работать так, как вы упомянули, и это один из вариантов использования. –

+0

@GregoryR: вместо передачи 'obj_a'' 'b_method()' каждый раз, когда вы его вызываете, вы также можете добавить '__init__() 'to' class B' и передать 'obj_a' ему только один раз, когда вы создаете' obj_b' - конечно, '__init __()' нужно будет сохранить значение для доступа позже в 'b_method' по мере необходимости, что-то вроде что показано во втором примере этого ответа. – martineau

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