Как реализовать метод от метода с бесконечной вложенностью?

Решаю задачу, где надо сделать класс, методы которого расставляли бы соответствующие тэги в строку/строки, которые туда подаются. Одним из условий является наличие возможности применять методы друг за другом до бесконечности , т.е.format.div.h1('text') на выходе должно давать тоже самое, как если бы я результат format.h1, затем подал в format.div --> <div><h1>text</h1></div> Подскажите, пожалуйста, каким образом это можно сделать? Мой код:

class Format:
    def div(self, *args: str):
        combo = ''.join(args)
        return f'<div>{combo}</div>'

    def h1(self, *args: str):
        combo = ''.join(args)
        return f'<h1>{combo}</h1>'

    def p(self, *args: str):
        combo = ''.join(args)
        return f'<p>{combo}</p>'

    def span(self, *args: str):
        combo = ''.join(args)
        return f'<span>{combo}</span>'

Ответы (3 шт):

Автор решения: Zhihar

а почему не попробовать сделать следующее:

класс Format должен возвращать не строки, а опять же элемент класса Format

и добавить в класс преобразование результата в строку __str__

тогда получится делать такие сцепки

class Format:
    def __init__(self, data = ""):
        self.data = data

    def __str__(self):
        return self.data

    def div(self, *args: str):
        combo = self.data + ''.join(args)
        return Format(f'<div>{combo}</div>')

    def h1(self, *args: str):
        combo = self.data + ''.join(args)
        return Format(f'<h1>{combo}</h1>')


res = Format("a").div("10").h1("20")

print(res)

результат: <h1><div>a10</div>20</h1>

→ Ссылка
Автор решения: Danis
class Format():
    def __init__(self, string = ""):
        self.string = string
    
    
    def __call__(self, value):
        return self.string + value + self.string.replace("<", "</")
        
    def __getattr__(self, attr):
        return Format(f"{self.string}<{attr}>")
    
    def __str__(self):
        return self.string
→ Ссылка
Автор решения: Александр Вахов

К ответу Danis, небольшое дополнение, иначе закрывающие тэги идут не в правильном порядке.

class Format():
    def __init__(self, string='', revers_string=''):
        self.string = string
        self.revers_string = revers_string

    def __call__(self, value):
        return f'{self.string}{value}{self.revers_string}'

    def __getattr__(self, attr):
        return Format(f'{self.string}<{attr}>', f'</{attr}>{self.revers_string}')

    def __str__(self):
        return self.string
→ Ссылка