szymcio32
10/23/2019 - 8:57 PM

Decorators

Function and class decorators

# Simple decorator
def html_tag_h1(func):
    def wrapper(*args, **kwargs):
        return_val = func(*args, **kwargs)
        return f'<h1>{return_val}</h1>'
    return wrapper

@html_tag_h1
def hello(text):
    return f'Hi {text}'
    
    
# Decorator with arguments
def html_tag(html_tag):
    def decorator(func):
        def wrapper(*args, **kwargs):
            return_val = func(*args, **kwargs)
            return f'<{html_tag}>{return_val}</{html_tag}>'
        return wrapper
    return decorator

@html_tag('h5')
def hello_with_tag(text):
    return f'Hi {text}'
    

# Simple class decorator
class Count:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        return f'<h1>{self.func(*args, **kwargs)}</h1>'


@Count
def html_class_tag_h1(text):
    return f'Hi {text}'


# Class decorator with arguments
class Count:
    def __init__(self, tag):
        self.tag = tag

    def __call__(self, func):
        def wrapper(*args, **kwargs):
            return f'<{self.tag}>{func(*args, **kwargs)}</{self.tag}>'
        return wrapper


@Count('h5')
def html_class_with_tag(text):
    return f'Hi {text}'