Python. Передача экземпляров в inner class

Можно ли во внутреннем классе обратиться к экземпляру внешнего класса, без указания его в качестве атрибута конструктора внутреннего класса?

Рассмотрим пример

class A:
    def __init__(self, atr1):
        self.connect = f'connect A class {atr1}'
        
    class B:
        def __init__(self, time):
            self.time = time
            self.connect = super(A).connect

В результате ожидаю получить следующее:

obj_A = A('atr1')
obj_B1 = obj_A.B(10)
obj_B2 = obj_A.B(100)

print(obj_A.connect) # connect A class atr1
print(obj_B1.connect) # connect A class atr1
print(obj_B2.connect) # connect A class atr1

Возможно, мне не стоит использовать внутренний класс, а стоит рассмотреть другие принципы ООП?

Пробовал воспользоваться get методом, но не вышло ожидаемого результата.

class A:
    def __init__(self, atr1):
        self.connect = f'connect A class {atr1}'

    class B:
        def __init__(self, time):
            super(A.B, self).__init__()
            self.time = time

    def get_B(self, time):
        return A(self).B(time)
obj = A('atr1')
obj2 = obj.B(222)
obj3 = obj.B(122)

Из обсуждения пришел к следующему:

class A:
    def __init__(self, atr1):
        self.connect = f'connect A class {atr1}'


class B:
    def __init__(self, time, obj: A):
        self.time = time
        self.obj_A = obj
        self.connect = obj_A.connect

if __name__ == '__main__':
    obj_A = A('atr1')
    obj_B1 = B(10, obj_A)
    obj_B2 = B(100, obj_A)
    print(obj_A.connect)  # connect A class atr1
    print(obj_B1.connect)  # connect A class atr1
    print(obj_B2.connect)  # connect A class atr1

Это работает, но не дает лаконичности кода для вызова объектов завязанных на родителе.


Ответы (1 шт):

Автор решения: splash58

не очень понятно, чего вы хотите добиться. у вас получается, что объекты класса B должны быть зависимы от конкретного объекта класса А, а вовсе даже не от класса А

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

def init(self, time):
    self.time = time

class A:
    def __init__(self, atr1):
        self.connect = f'connect A class {atr1}'
        self.B = type('B', (object,), {'connect': f'connect A class {atr1}', '__init__': init})


obj_A = A('atr1')
obj_B1 = obj_A.B(10)
obj_B2 = obj_A.B(100)

print(obj_A.connect)  # connect A class atr1
print(obj_B1.connect)  # connect A class atr1
print(obj_B2.connect)  # connect A class atr1
→ Ссылка