def __init__(self, source, attributes=None, allow_class=False, allow_subclasses=True,<EOL>propagate_attributes=True, inherit_attributes=True, parent_sources=None):
if not isinstance(source, type):<EOL><INDENT>raise InvalidSource(source)<EOL><DEDENT>self.source = source<EOL>if not isinstance(attributes, Attributes):<EOL><INDENT>attributes = self.Attributes(*(attributes or []))<EOL><DEDENT>self.attributes = attributes<EOL>self.allow_class = allow_class<EOL>self.allow_subclasses = allow_subclasses<EOL>self.propagate_attributes = propagate_attributes<EOL>self.inherit_attributes = inherit_attributes<EOL>self.parent_sources = parent_sources or set()<EOL>
Initialize a source class with a list of allowed attributes.

        Arguments
        ---------
        source : type
            Must be a class for which we want to allow access to only the given attributes.
        attributes : iterable[str] / Attributes, optional
            A list (or other iterable) of string representing the names of the allowed
            attributes from the source.
            Can also be an ``Attributes`` instance.
            To allow all attributes, you must pass an ``Attributes`` instance with
            ``allow_all=True``.
        allow_class : boolean, default ``False``
            If set to ``True``, the source apply not only to instances of the source class, but
            also to the class itself.
        allow_subclasses : boolean, default ``True``
                When ``True``, if an instance of a subclass is used without defined source, this
                source will be used.
        propagate_attributes : boolean, default ``True``
            When ``True``, all the attributes of this source will be propagated to subclasses of
            this source (except if the subclass has ``inherit_attributes`` set to ``False``.
            When ``False``, subclasses will have to declare their own attributes.
        inherit_attributes : boolean, default ``True``
            When ``True``, if the source class has a parent class in the registry, it will inherits
            its attributes if it has ``propagate_attributes`` set to ``True``.
            When ``False``, it has to declare its own attributes
        parent_sources : set
            If ``inherit_attributes`` is ``True``, this set will hold all the sources that are
            parent of the current one.

        Raises
        ------
        dataql.solvers.exception.InvalidSource
            When the given source is not a valid class.