Python - Доступ к родительским членам

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

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

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 определен внутри.

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

2 ответа

На самом деле в вашем примере вы не можете получить доступ к экземпляру 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!'

Если вы передадите объект (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()
Другие вопросы по тегам