Область видимости дочерних классов Python
пишу простой TCP сервер, решил остановиться на такой архитектуре, напишу очень упрощенно чтобы была понятна суть ошибки.
class Server:
connections = {}
...
class Connection:
...
def func(self):
connections[self.key] = value
Внутри функции func доступа к connections нет, как и во всем внутреннем классе. В связи с этим два вопроса:
- Где можно найти хорошее пояснение про области видимости вложенных классов
- Как лучше организовать код основываясь на следующих идеях:
- Есть класс оболочка (сервер)
- Есть класс содержания (соединения)
- У всех объектов содержания есть простой доступ к атрибутам объекта оболочки (self.parent.foo) очевидно, но громоздко
- Оболочка легко взаимодействует с содержащимися объектами Надеюсь на ваше понимание
Ответы (1 шт):
Автор решения: extrn
→ Ссылка
Могу предположить, что вам нужно что-то вроде этого
class Connection:
pass
class Server:
def __init__(server, *server_args):
server.connections = set()
class Connection_(Connection):
server_ = server
def __init__(client, *client_args):
server.connections.add(client)
# Отсюда видим
# Экземпляр сервера: server
# Аргументы сервера: server_args
# Экземпляр клиента: client
# Аргументы клиента: client_args
# Соединения сервера: server.connections
server.connection = Connection_
server1 = Server('server1_arg1', 'server1_arg2')
client1 = server1.connection('client1_arg1', 'client1_arg2')
server2 = Server('server2_arg1', 'server2_arg2')
client2 = server2.connection('client2_arg1', 'client2_arg2')
print(server1.connections)
print(server2.connections)
print(isinstance(client1, Connection))
print(isinstance(client1, server1.connection))
print(not isinstance(client1, server2.connection))
print(server1.connection.server_ is server1)
{<__main__.Server.__init__.<locals>.Connection_ object at 0x7f017db2eeb0>}
{<__main__.Server.__init__.<locals>.Connection_ object at 0x7f017db2ed60>}
True
True
True
True
Иначе нет особого смысла помещать один класс в другой.