Source code for foxes.utils.subclasses
[docs]
def all_subclasses(cls):
"""
Searches all classes derived from some
base class.
Parameters
----------
cls: class
The base class
Returns
-------
list of class:
The derived classes
:group: utils
"""
return set(cls.__subclasses__()).union(
[s for c in cls.__subclasses__() for s in all_subclasses(c)]
)
[docs]
def new_cls(base_cls, cls_name):
"""
Run-time class selector.
Parameters
----------
base_cls: object
The base class
cls_name: string
Name of the class
Returns
-------
cls: object
The derived class
:group: utils
"""
if cls_name is None:
return None
allc = all_subclasses(base_cls)
found = cls_name in [scls.__name__ for scls in allc]
if found:
for scls in allc:
if scls.__name__ == cls_name:
return scls
else:
estr = "Class '{}' not found, available classes derived from '{}' are \n {}".format(
cls_name, base_cls.__name__, sorted([i.__name__ for i in allc])
)
raise KeyError(estr)
[docs]
def new_instance(base_cls, cls_name, *args, **kwargs):
"""
Run-time factory.
Parameters
----------
base_cls: object
The base class
cls_name: string
Name of the class
args: tuple, optional
Additional parameters for the constructor
kwargs: dict, optional
Additional parameters for the constructor
Returns
-------
obj: object
The instance of the derived class
:group: utils
"""
cls = new_cls(base_cls, cls_name)
if cls is None:
return None
else:
return cls(*args, **kwargs)