2

In the following example, the list1 attribute of P represents a list of instances of A.

class A:
   value1: str

class B(A):
   value2: str

class P:
   list1: List[A]

I want is to keep a list of child classes of A (not instances of A) in the variable list1. Is there a way to do it in python?

Janaka Chathuranga
  • 1,742
  • 16
  • 19

3 Answers3

2

The solution is to use https://docs.python.org/3/library/typing.html#typing.Type.

from typing import List, Type

class P:
   list1: List[Type[A]]

Now, list1 represents a list of classes extended from A.

Janaka Chathuranga
  • 1,742
  • 16
  • 19
  • Sorry to bother I am new to python but do your variables annotations look like functions annotstions ?? Here they show them differently: https://www.python.org/dev/peps/pep-0526/ . Maybe I need to figure it out better – pippo1980 Jan 11 '22 at 11:51
0

my try copying from first answer here :How to find all the subclasses of a class given its name? :

class klass():
    pass



class popo(klass):
    pass

class pepe(klass):
    pass



class P():
    

    def get_all_subclasses(self, cls):
        subclass_list = []
    
        def recurse(classe):
            for subclass in classe.__subclasses__():
                subclass_list.append(subclass)
                recurse(subclass)
    
        recurse(cls)
    
        return list(set(subclass_list))

a = P()


print(a.get_all_subclasses(klass),'\n')

print(type(a.get_all_subclasses(klass)),'\n')


class papa(klass):
    pass

class coco(popo):
    pass


print(a.get_all_subclasses(klass),'\n')

output:

[<class '__main__.popo'>, <class '__main__.pepe'>] 

<class 'list'> 

[<class '__main__.papa'>, <class '__main__.popo'>, <class '__main__.pepe'>, <class '__main__.coco'>] 

or :

class klass:
    pass


class popo(klass):
    pass


class pepe(klass):
    pass


class P:
    def __init__(self, classez):
        self.list1 = []

        self.get_all_subclasses(classez)

        pass

    def get_all_subclasses(self, cls):
        def recurse(classe):
            for subclass in classe.__subclasses__():
                self.list1.append(subclass)
                recurse(subclass)  # necessarioo per avere coco nella lista

        recurse(cls)

        self.list1 = list((self.list1))

        return self.list1


a = P(klass)

print(a.list1, "\n")

print(type(a.list1), "\n")


class papa(klass):
    pass


class coco(popo):
    pass


a = P(klass)


print(a.list1)

I get too:

[<class '__main__.popo'>, <class '__main__.pepe'>] 

<class 'list'> 

[<class '__main__.popo'>, <class '__main__.coco'>, <class '__main__.pepe'>, <class '__main__.papa'>]

using :

class klass():
    pass



class popo(klass):
    pass

class pepe(klass):
    pass


print(klass.__subclasses__(),'\n')



class papa(klass):
    pass

class coco(popo):
    pass


print(klass.__subclasses__(),'\n')

I get:

[<class '__main__.popo'>, <class '__main__.pepe'>] 

[<class '__main__.popo'>, <class '__main__.pepe'>, <class '__main__.papa'>] 

pippo1980
  • 2,181
  • 3
  • 14
  • 30
-1
...
class P:
    A.__subclasses__()

>>> [<class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>]

subclasses - Returns a list of weak references to classes directly inherited from this one. enter link description here