Reputation: 1603
Is it possible to let a superclass to have all subclass's type (Type
) as a class variable (ClassVar
)?
For example, if we have
class A:
sub_types: ClassVar[List[Type["A"]]]
class B(A): pass
class C(A): pass
class D(A): pass
What I want is A.sub_types = [A, B, C, D]
and B.sub_type = [A, B, C, D]
and the same for both C
and D
.
Upvotes: 1
Views: 26
Reputation: 1201
Yes, we may leverage __init_subclass_
for this behavior and then have a list modified for each subclass. Like this :
class SubTypeWatch:
sub_types = []
def __init_subclass__(cls, **kwargs) -> None:
cls.sub_types.append(cls)
super().__init_subclass__(**kwargs)
Then let your first child (root) class Inherit this
class A(SubTypeWatch):
pass
class B(A):
pass
class C(B):
pass
class D(C):
pass
This would result in a shared common sub_type
between children.
And it's the same for A
, B
, C
, and D
as you specified (it's the same list
instance even).
>>> A.sub_types
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]
>>> B.sub_types
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]
>>> C.sub_types
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]
>>> D.sub_types
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]
>>>
Upvotes: 2