:param start: an object of NoneType or Path or str.
        :return: a string
            If `start` is None:
                returns the relative path of current Path object from its own directory.
            Else:
                returns the relative path of current Path object from the `start` path.
        e.g
        - Dir1
            - Dir2
                - File1
                - File2
            - Dir3
                - File3
            Path(<path of File1>).relative() => "<filename of File1>"
            Path(<path of Dir2>).relative() => "<directory name of Dir1>"
            Path(<path of File3>).relative(<path of File1>) => "../Dir2/<filename of File1>"

def relative(self,
                 start: typing.Optional[typing.Union['Path', str]] = None
                 ) -> str:
        """
        :param start: an object of NoneType or Path or str.
        :return: a string
            If `start` is None:
                returns the relative path of current Path object from its own directory.
            Else:
                returns the relative path of current Path object from the `start` path.
        e.g
        - Dir1
            - Dir2
                - File1
                - File2
            - Dir3
                - File3
            Path(<path of File1>).relative() => "<filename of File1>"
            Path(<path of Dir2>).relative() => "<directory name of Dir1>"
            Path(<path of File3>).relative(<path of File1>) => "../Dir2/<filename of File1>"
        """
        if start is None:
            return os.path.split(str(self))[1]
        if isinstance(start, Path):
            start = str(start)
        return os.path.relpath(str(self), start)