Menu
CoddyTech

Kết hợp decorator

Bài học 7 trên 12 trong khóa học Trình trang trí trong Python của Coddy.

Bạn có thể kết hợp nhiều decorator với nhau để thay đổi cách hoạt động của một hàm (function). Để kết hợp các decorator, bạn chỉ cần áp dụng chúng lần lượt, trong đó decorator trong cùng nằm gần hàm được trang trí nhất.

Đây là một ví dụ:

def make_bold(func):
    def wrapper():
        return "<b>" + func() + "</b>"
    return wrapper

def make_italic(func):
    def wrapper():
        return "<i>" + func() + "</i>"
    return wrapper

@make_bold
@make_italic
def hello():
    return "Hello, world!"

print(hello())

Kết quả cuối cùng là:

<b><i>Hello, world!</i></b>

Hãy lưu ý rằng trong ví dụ trên, decorator trả về giá trị từ hàm. Trước giờ, mình chỉ thấy các decorator thực thi hàm mà không trả về kết quả của hàm!

challenge icon

Thử thách

Trung bình

Viết một hàm có tên my_decorator nhận một đối số số nguyên n và trả về một hàm trang trí bọc một hàm đã cho func trong n lớp thẻ HTML. Thẻ ngoài cùng phải là <div>, lớp tiếp theo phải là <p>, cứ thế tiếp tục, mỗi lớp kế tiếp luân phiên giữa thẻ <div> và <p>. Lớp trong cùng phải bọc đầu ra của hàm trong thẻ <b>.

Bạn được cung cấp code sẽ chạy cùng với my_decorator, đừng thay đổi code đó!

 

Ví dụ:

@my_decorator(3)
def my_function(s):
	return s.upper()

result = my_function("hello world")
print(result)

Đầu ra:

<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>

Dùng dòng mới (\n) để định dạng đầu ra cho chính xác!

Tự làm thử

# Viết code ở đây


# Đừng thay đổi phần bên dưới dòng này
n = int(input())

@my_decorator(n)
def my_function(s):
    return s.upper()

result = my_function(input())
print(result)

Tất cả bài học trong Trình trang trí trong Python

Tự luyện tập: Trình biên dịch Python online