Python - Доступ к родительским членам - PullRequest
2 голосов
/ 14 декабря 2011

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

По сути, это работает (класс 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 ]

3 голосов
/ 14 декабря 2011

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

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