HiroIshida
HiroIshida

Reputation: 1603

Is it possible to let a superclass to have all subclass as a class variable

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

Answers (1)

Achxy_
Achxy_

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

Related Questions