2011-12-13 3 views
2

Я столкнулся с этим вопросом, пытаясь выяснить, как иметь классы-члены для доступа к данным от своего родителя, когда они являются частью внешнего модуля.Python - Доступ к родительским элементам

В основном, это работает (класс B может получить доступ в методы родителя, как так: A.say_hi (А)):

class A: 
    def __init__(self): 
     print("Initializing parent object...") 
     self.child = self.B() 

    class B: 
     def __init__(self): 
      print("Initializing child...") 
      A.say_hi(A) 

    def say_hi(self): 
     print("A class says hi") 

Однако, это может быть довольно неаккуратно, если классы начинают получать очень большой, так Я размещал свои дополнительные классы в файлах и импортировал их в очередь. Проблема в том, что я больше не могу получить класс-член для доступа к членам и функциям своего родителя, если я попытаюсь использовать «import B.py», когда класс B определен внутри.

Есть ли способ получить исходное поведение, не выходя из класса элемента в том же файле, что и родительский?

+0

какая версия python вы используете? в 2.7 он не работает, поскольку вы проходите A (класс), где ожидается экземпляр – soulcheck

+0

Правильно ли ваш отступ? Кажется, это не так. «класс B может получить доступ к методам родительского типа: A.say_hi (A)» не имеет никакого смысла. Поскольку «A.say_hi (A)» - очень, очень своеобразный Python. Вы смущены о наследовании? Это ваш вопрос? –

+0

@soulcheck работает в py3k (с отступом, как и в сообщении) – joaquin

ответ

3

Фактически в вашем примере вы не можете получить доступ к экземпляру A в своем классе B. И код A.say_hi(A) действительно работает, но не так. Это было сказано в комментариях к вашему вопросу.

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

Модуль b:

class B(object): 
    def __init__(self, parent): 
     self.parent = parent 

    def say_hi(self): 
     print 'Child says hi to his parent %s' % (
      self.parent.__class__.__name__ 
     ) 
     self.parent.say_hi() 

Модуль a:

from b import B 

class A(object): 
    def __init__(self): 
     self.b = B(self) 

    def say_hi(self): 
     print 'Parent says hi!' 
+0

Он может получить доступ к «A» из «B» в своем коде из-за побочного эффекта: класс A будет доступен в глобальном пространстве имен модуля когда функции в B окончательно вызывают, из экземпляра «A». – jsbueno

+0

Доступ к классу A, но не экземпляр A, это важное различие. Если бы не круговые импорты, было бы легко получить доступ к классу A в модуле b, просто импортируйте его и у вас есть. – Ski

0

Если передать объект (a) в класс (b), вы можете вызвать его напрямую.

class a(): 
    def __init__(self): 
     print"Made A" 

    def test(self): 
     print ">>A Test" 

class b(): 
    def __init__(self,parent): 
     print"Made B" 
     self.parent = parent   
    def test(self): 
     print ">>B Test" 
     self.parent.test() 

a = a() 
a.test() 
b = b(a)   
b.test() 
Смежные вопросы