Как изменить атрибут экземпляра объекта, вызвав статически вызываемый метод во вложенных классах - PullRequest
0 голосов
/ 28 июня 2019

Я хочу, чтобы класс Inner изменил атрибут экземпляра объекта (o), в данном случае, "some_var"; o.some_var.

Я уже пробовал искать в Google и в stackoverflow о вложенных классах и о том, как внутренний класс может обращаться к атрибутам внешнего класса. Я изменил параметры, взятые внутренним классом, такие как экземпляр объекта (self), без эффекта.

class Outer:
    def __init__(self):
        self.some_var = 1
        self.Inner = Inner()

    class Inner:
        def print_some_var(self):
            print("I'm Inner's method, printing:", self.some_var)

        def change_some_var(self, n):
            self.some_var = n

o = Outer()

print("Printing directly.", o.some_var)
o.Inner.print_some_var()
o.Inner.change_some_var(5)
o.Inner.print_some_var()

Мне нужны две вещи из этого кода, оба основаны на доступе к классу Inner класса Inner, а также на его изменении / чтении путем статического вызова (класс Inner) и изменения атрибута объекта класса Outer (some_var ). Как:

  1. измените объект some_var класса Outer, вызвав класс Inner, например, "o.Inner.change_some_var (5)".
  2. распечатайте / прочитайте объект some_var класса Outer, также статически вызывая класс Inner внутри экземпляра объекта, например "o.Inner.print_some_var ()".

Вместо этого интерпретатор python выдает мне исключение:

Traceback (most recent call last):
  File "nestedclasses.py", line 16, in <module>
    o.Inner.print_some_var()
  File "nestedclasses.py", line 8, in print_some_var
    print("I'm Inner's method, printing:", self.some_var)
AttributeError: 'Inner' object has no attribute 'some_var'

1 Ответ

2 голосов
/ 28 июня 2019
class Outer:
    def __init__(self):
        self.some_var = 1
        self.inner = Inner(self)

class Inner:
    def __init__(self, parent):
        self.parent = parent

    def print_some_var(self):
        print("I'm Inner's method, printing:", self.parent.some_var)

    def change_some_var(self, n):
        self.parent.some_var = n

o = Outer()

print("Printing directly.", o.some_var)
o.inner.print_some_var()
o.inner.change_some_var(5)
o.inner.print_some_var()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...