Как реализовать метод от метода с бесконечной вложенностью?
Решаю задачу, где надо сделать класс, методы которого расставляли бы соответствующие тэги в строку/строки, которые туда подаются. Одним из условий является наличие возможности применять методы друг за другом до бесконечности , т.е.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 шт):
а почему не попробовать сделать следующее:
класс 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>
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