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

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

Можно ли получить атрибут "a" класса C, из класса A?
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 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, то последний сможет пользоваться этой ссылкой, точно так же как и любой другой переданной ссылкой на объект. В том числе обращаться к атрибутам, вызывать методы и пр.
Если ты явно ссылку не передаёшь, то ей взяться будет неоткуда.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
24 апр. 2024, в 13:10
400000 руб./за проект
24 апр. 2024, в 13:01
5000 руб./за проект
24 апр. 2024, в 13:00
3000 руб./за проект