Esempio n. 1
0
def AllSubclassesOfClass(cls: typing.Type) -> typing.Set[typing.Type]:
  """Return the set of subclasses of a base class.

  This recursively returns all nested subclasses of a base class.

  Example:
    >>> class A(object): pass
    >>> class B(A): pass
    >>> class C(B): pass
    >>> AllSubclassesOfClass(A)
    {B, C}

  Args:
    cls: The class to return subclasses of.

  Returns:
    A set of class types.
  """
  return set(cls.__subclasses__()).union(
<<<<<<< HEAD
<<<<<<< HEAD:labm8/py/labtypes.py
<<<<<<< HEAD
<<<<<<< HEAD:labm8/py/labtypes.py
<<<<<<< HEAD:labm8/py/labtypes.py
=======
>>>>>>> 4242aed2a... Automated code format.
=======
>>>>>>> 4242aed2a... Automated code format.
    [s for c in cls.__subclasses__() for s in AllSubclassesOfClass(c)],
  )
Esempio n. 2
0
def find_all_subclasses(cls: tp.Type) -> tp.List[tp.Type]:
    """
    Recursively finds all subclasses of the given class and returns them as a list.

    :param cls: class to find the subclasses of
    :return: list of subclasses of the given class
    """

    return cls.__subclasses__() + [
        g for s in cls.__subclasses__() for g in find_all_subclasses(s)
    ]
Esempio n. 3
0
        def spelunk(c: typ.Type):
            for subclass in c.__subclasses__():
                yield from spelunk(subclass)

                if subclass not in unique_seen:
                    yield subclass
                    unique_seen.add(subclass)
Esempio n. 4
0
def AllSubclassesOfClass(cls: typing.Type) -> typing.Set[typing.Type]:
    """Return the set of subclasses of a base class.

  This recursively returns all nested subclasses of a base class.

  Example:
    >>> class A(object): pass
    >>> class B(A): pass
    >>> class C(B): pass
    >>> AllSubclassesOfClass(A)
    {B, C}

  Args:
    cls: The class to return subclasses of.

  Returns:
    A set of class types.
  """
    return set(cls.__subclasses__()).union(
        [s for c in cls.__subclasses__() for s in AllSubclassesOfClass(c)], )
Esempio n. 5
0
def get_local_subclasses(module, parent_class: typing.Type) -> typing.Sequence:
    if not hasattr(parent_class, "__subclasses__"):
        return list()

    subclasses = [
        member for name, member in inspect.getmembers(module)
        if inspect.isclass(member) and not inspect.isabstract(member)
        and member in parent_class.__subclasses__()
    ]

    return subclasses