Как обращаться к атрибутам надкласса?

Например есть такой код:
class C:
    def __init__(self):
        self.a = 5
    class A:
        def __init__(self):
            self.b = ?

Можно ли получить атрибут "a" класса C, из класса A?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 2
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Полно "интересных" артефактов у этого подхода

spoiler

class A:
    def __init__(self, name):
        self.name = name
        self.inner = self.B(self)

    def get_name(self):
        return self.name

    class B:
        def __init__(self, parrent=None):
            self.parrent = parrent

            self.name = "val 2"
            if parrent:
                self.name = self.parrent.name

        def test(self):
            return self.name

        def get_name(self):
            return self.name.upper()

        def set_name(self, val):
            self.name = val

        def make(self):
           return self.parrent.B()

obj = A("val 1")
print(obj.get_name())
print(obj.inner.get_name())

o = []
for i in range(5):
    o.append(obj.inner.make())
    o[i].set_name(str("new val {}".format(i)))

for i in o:
    print(i.get_name())

print(A("test").B().test())

и...
val 1
VAL 1
NEW VAL 0
NEW VAL 1
NEW VAL 2
NEW VAL 3
NEW VAL 4
val 2

Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
То, что класс A определён внутри C, ещё не значит, что будет хоть какая-то связь между экземплярами этих классов. У тебя может быть экземпляр A, который создан просто вот так a = C.A(), отдельно от класса C.
Так что ответ такой: если ты явно передаешь ссылку на экземпляр класса C экземпляру класса A, то последний сможет пользоваться этой ссылкой, точно так же как и любой другой переданной ссылкой на объект. В том числе обращаться к атрибутам, вызывать методы и пр.
Если ты явно ссылку не передаёшь, то ей взяться будет неоткуда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы