Вы можете будет лучше, если вы просто не будете использовать вложенные классы. Если вы должны вложить, попробуйте следующее:
x = 1
class OuterClass:
outer_var = x
class InnerClass:
inner_var = x
Или объявите оба класса перед их вложением:
class OuterClass:
outer_var = 1
class InnerClass:
inner_var = OuterClass.outer_var
OuterClass.InnerClass = InnerClass
(После этого вы можете del InnerClass
, если вам нужно.)
class Outer(object):
outer_var = 1
class Inner(object):
@property
def inner_var(self):
return Outer.outer_var
Это не совсем то же самое, что аналогичные вещи работают на других языках, и использует глобальный поиск вместо определения области доступа к external_var
. (Если вы измените объект, к которому привязано имя Внешний
, тогда этот код будет использовать этот объект при следующем выполнении.)
Если вместо этого вы хотите, чтобы все объекты Внутренние
иметь ссылку на Outer
, потому что external_var
на самом деле является атрибутом экземпляра:
class Outer(object):
def __init__(self):
self.outer_var = 1
def get_inner(self):
return self.Inner(self)
# "self.Inner" is because Inner is a class attribute of this class
# "Outer.Inner" would also work, or move Inner to global scope
# and then just use "Inner"
class Inner(object):
def __init__(self, outer):
self.outer = outer
@property
def inner_var(self):
return self.outer.outer_var
Обратите внимание, что классы вложенности несколько необычны в Python и автоматически не подразумевают каких-либо специальных отношения между классами. Лучше не влезать. (Вы по-прежнему можете установить атрибут класса на Внешний
на Внутренний
, если хотите.)