Я видел несколько «решений» для этого, но решение каждый раз выглядит так: «Не используйте вложенные классы, определяйте классы снаружи, а затем используйте их в обычном режиме». Мне не нравится этот ответ, потому что он игнорирует основную причину, по которой я выбрал вложенные классы, а именно наличие пула констант (связанных с базовым классом), доступных для всех созданных экземпляров подкласса.
Вот пример кода:
class ParentClass:
constant_pool = []
children = []
def __init__(self, stream):
self.constant_pool = ConstantPool(stream)
child_count = stream.read_ui16()
for i in range(0, child_count):
children.append(ChildClass(stream))
class ChildClass:
name = None
def __init__(self, stream):
idx = stream.read_ui16()
self.name = constant_pool[idx]
Всем классам передается один параметр, который является пользовательским классом битового потока. Мое намерение состоит в том, чтобы иметь решение, которое не требует, чтобы я читал значение idx для ChildClass, все еще находясь в ParentClass. Все чтение потока дочернего класса должно выполняться в дочернем классе.
Этот пример слишком упрощен. Постоянный пул - не единственная переменная, которая мне нужна, доступная для всех подклассов. Переменная idx — не единственное, что считывается из потокового считывателя.
Возможно ли это вообще в питоне? Нет ли доступа к информации о родителях?
def add_parent_links(cls): cls_init = cls.__init__ def __init__(self, s): for k in dir(self): if str(type(getattr(self,k))).find('classobj') > -1: getattr(self,k).parent = self cls_init(self, s) cls.__init__ = __init__ return cls
18.06.2011