Рассмотрим код ниже:
class A(object):
attr = None
def __init__(self):
assert A.attr is not None
class B(object):
def __init__(self, attr):
A.attr = attr
class C(A):
def __init__(self):
super().__init__()
class D(A):
def __init__(self):
super().__init__()
nested_classes = {cls.__name__: cls for cls in {C, D}}
Выше, кажется, не работает, как я намерен, потому что:
>>> first_class = B("first")
>>> first_sub_class = first_class.C()
>>> first_sub_class.attr
'first'
>>> second_class = B("second")
>>> second_sub_class = second_class.C()
>>> second_sub_class.attr
'second'
>>> first_sub_class.attr
'second'
Есть ли способ получить first_sub_class.attr
быть first
имея second_sub_class.attr
быть second
?Возможно, имея метакласс, область действия которого находится в пределах B?
Несколько моментов:
- Я не хочу передавать
attr
, я хочу установить его, пока Bбудучи инициализированным. - Я не хочу обойти вышеуказанную точку, используя
partial
, так как он нарушает остальную часть кода, полагаясь на __name__
или __qualname__
или аналогично. - Я хочу сохранить верность существующей структуре в максимально возможной степени.