前后的装饰器模式日志



我想记录我的文本变化的每次迭代,但不确定应该是什么正确的方法。见下文。第一个测试是将<i><u><b>GeeksforGeeks</b></u></i>GeeksforGeeks和最后一个。我想打印每次迭代的文本变化。我知道我可以这样做,通过在每个其他包装器之前添加LoggingWrapper来查看每次迭代,如下所示:

gfg = LoggerWrapper(ItalicWrapper(LoggerWrapper(
UnderlineWrapper(LoggerWrapper(BoldWrapper(LoggerWrapper(start)))))))

所以我看到了我想看到的:

LOG: GeeksforGeeks
LOG: <b>GeeksforGeeks</b>
LOG: <u><b>GeeksforGeeks</b></u>
LOG: <i><u><b>GeeksforGeeks</b></u></i>

但我不确定它是好的方法还是我应该这样做不同?是的,这样我就可以决定哪一步我想看日志了,对吧?这是正确的方式还是?

我代码:

class WrittenText:
"""Represents a Written text """
def __init__(self, text):
self._text = text
def render(self):
return self._text

class UnderlineWrapper(WrittenText):
"""Wraps a tag in <u>"""
def __init__(self, wrapped):
self._wrapped = wrapped
def render(self):
return "<u>{}</u>".format(self._wrapped.render())

class ItalicWrapper(WrittenText):
"""Wraps a tag in <i>"""
def __init__(self, wrapped):
self._wrapped = wrapped
def render(self):
return "<i>{}</i>".format(self._wrapped.render())

class BoldWrapper(WrittenText):
"""Wraps a tag in <b>"""
def __init__(self, wrapped):
self._wrapped = wrapped
def render(self):
return "<b>{}</b>".format(self._wrapped.render())

class LoggerWrapper(WrittenText):
"""Makes log"""
def __init__(self, wrapped):
self._wrapped = wrapped
def render(self):
result = self._wrapped.render()
print("LOG: " + result)
return result

""" main method """
if __name__ == '__main__':
start = WrittenText("GeeksforGeeks")
gfg = LoggerWrapper(ItalicWrapper(
UnderlineWrapper(BoldWrapper(LoggerWrapper(start)))))
gfg.render()

您可以遍历要应用于文本的包装器序列,并使用LoggerWrapper包装每个包装器调用:

gfg = 'GeeksforGeeks'
for wrapper in WrittenText, BoldWrapper, UnderlineWrapper, ItalicWrapper:
gfg = LoggerWrapper(wrapper(gfg))
gfg.render()

在我看来,你用得非常正确。

我想到了一个替代方案,仅供讨论,我正在使用函数式编程:

if __name__ == '__main__':
italic_func = lambda x: "<i>{}</i>".format(x)
bold_func = lambda x: "<b>{}</b>".format(x)
underline_func = lambda x: "<u>{}</u>".format(x)
log_func = lambda x: print("LOG: " + x)
start = WrittenText("GeeksforGeeks")
result = log_func(underline_func(bold_func(italic_func(log_func(start.render())))))

@nin17谢谢你指出这一点,我想用def代替。

def italic_func(x): return  f"<i>{x}</i>"
# other functions

如果你想记录一些函数调用前后的日志,我认为python的decorator是解决方案

def MyLogger():
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print("before LOG: " + str(args))
result = func(*args, **kwargs)
print("after LOG: " + result)
return result
return wrapper
return decorator
class BoldWrapper(WrittenText):
"""Wraps a tag in <b>"""
def __init__(self, wrapped):
self._wrapped = wrapped
@MyLogger()
def render(self):
return "<b>{}</b>".format(self._wrapped.render())

最新更新