def METHOD_NAME(self, other, path="", ignored_keys=None, ignored_types=None):
    diff = []
    if type(self) != type(other):
        diff.append(f"{path}: __class__: '{type(self)}' _notEqual_ '{type(other)}'")
        return diff
    for attr_name in dir(self):
        self_attr = getattr(self, attr_name)
        if attr_name[0] == "_" or callable(self_attr) or \
                ignored_keys is not None and attr_name in ignored_keys or \
                ignored_types is not None and any([isinstance(self_attr, T) for T in ignored_types]):
            continue
        other_attr = getattr(other, attr_name)
        diff.extend(compare_iterable(self_attr, other_attr, path=f"{path}.{attr_name}"))
    return diff