Есть три проблемы с этим кодом. Во-первых, поскольку create-b
возвращает объект класса, а не экземпляр класса, запрос B __init__
никогда не запускался. Вы можете решить эту проблему с помощью
class A:
def __init__(self):
self.x = 1
B = self.create_b()
b = B()
print(b.y)
def create_b(self):
class B:
def __init__(self):
self.y = self.x
return B
A = A()
Во-вторых, вложенные классы не имеют доступа к локальному пространству имен метода упаковки, как вложенная функция (закрытие). При попытке self.y = self.x
экземпляры класса B не имеют особых отношений с экземпляром A, который их создал. Вы можете решить эту проблему с помощью
class A:
def __init__(self):
self.x = 1
B = self.create_b(self)
b = B()
print(b.y)
def create_b(self):
class B:
def __init__(self, a):
self.y = a.x
return B
A = A()
. В-третьих, python создает weakref
классам, когда они определены, которые никогда не исчезают. Каждый раз, когда вы вызываете create_b
, вы создаете небольшую утечку памяти. Вы можете решить это с помощью
class A:
def __init__(self):
self.x = 1
b = B(self)
print(b.y)
class B:
def __init__(self, a):
self.y = a.x
A = A()