Chúng ta đã biết rằng Decorator là một công cụ vô cũng mạnh mẽ và hữu dụng trong Python bởi vì nó cho phép các lập trình viên có thể chỉnh sửa hành vi của các hàm hoặc class. Trong bài học này, chúng ta sẽ tìm hiểu về “Decorator có tham số” thông qua nhiều ví dụ minh họa.

Bởi vì các hàm trong Python đều là các First Class Object – đối tượng hạng nhất nên chúng có thể được xử lý như các đối tượng.

– Hàm có thể được gán cho một biến, ví dụ, chúng có thể được tham chiếu tới.

– Hàm có thể được truyền làm đối số cho một hàm khác.

– Hàm có thể được trả về từ một hàm.

Các Decorator có tham số cũng tương tự với các decorator bình thường.

1. Cú pháp của decorator có tham số

@decorator(params)
def func_name():
    ''' Function implementation'''

Đoạn code trên tương đương với:

def func_name():
    ''' Function implementation'''

func_name = (decorator(params))(func_name)
"""

Do các câu lệnh được thực thi từ trái sang phải, nên khi decorator(params) được gọi, nó sẽ trả về một đối tượng fun_obj. Tiếp tục sử dụng đối tượng fun_obj để thực hiện lời gọi hàm fun_obj(func_name). Bên trong hàm này, các tính toán/xử lý cần thiết sẽ được thực thi, và cái tham chiếu đến hàm thật sự sẽ được trả về và gán cho func_name. Lúc này func_name() có thể được sử dụng để gọi hàm (với decorator đã được áp dụng trên nó).

2. Decorator có tham số được cài đặt như thế nào?

Phần này sẽ  trình bày về các đoạn code ví dụ nhằm minh họa hoạt động của Decorator có tham số trong Python để bạn đọc có được cái nhìn rõ ràng hơn về cơ chế hoạt động của tính năng này.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


def decorators(*args, **kwargs): 
    def inner(func): 
        ''' 
           do operations with func 
        '''
        return func 
    return inner #this is the fun_obj mentioned in the above content 
  
@decorators(params) 
def func(): 
    """ 
         function implementation 
    """

Tại đây, tham số params có thể là rỗng cũng được.

a) Ví dụ 1. Đoạn code Python minh họa về Decorator kiểu cơ bản trong Python

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------

# Python code to illustrate  
# Decorators basic in Python  
  
def decorator_fun(func):  
  print("Inside decorator")  
  
  def inner(*args, **kwargs):  
    print("Inside inner function")  
    print("Decorated the function")  
    # do operations with func 
      
    func() 
      
  return inner  
  
@decorator_fun
def func_to():  
    print("Inside actual function")  
  
func_to()  

b) Ví dụ 2. Đoạn code Python minh họa về Decorator kiểu có tham số trong Python

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python code to illustrate  
# Decorators with parameters in Python  
  
def decorator_fun(func):  
  print("Inside decorator")  
  
  def inner(*args, **kwargs):  
    print("Inside inner function")  
    print("Decorated the function")  
      
    func() 
      
  return inner  
  
  
def func_to():  
    print("Inside actual function")  
  
# another way of using decorators 
decorator_fun(func_to)()  

Kết quả in ra là:

Inside decorator
Inside inner function
I like geeksforgeeks
Inside actual function

c) Ví dụ 3. Đoạn code Python minh họa về Decorator kiểu có tham số trong Python


# Python code to illustrate  
# Decorators with parameters in Python  
  
def decorator(*args, **kwargs): 
    print("Inside decorator") 
      
    def inner(func): 
          
        # code functionality here 
        print("Inside inner function") 
        print("I like", kwargs['like'])  
          
        func() 
          
    # reurning inner function     
    return inner 
  
@decorator(like = "cafedevn") 
def my_func(): 
    print("Inside actual function") 

Kết quả in ra là:

Inside decorator
Inside inner function
I like cafedevn
Inside actual function

d) Ví dụ 4. Đoạn code Python minh họa về Decorator kiểu có tham số trong Python

Kết quả in ra là:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python code to illustrate  
# Decorators with parameters in Python  
  
def decorator_func(x, y): 
  
    def Inner(func): 
  
        def wrapper(*args, **kwargs): 
            print("I like Geeksforgeeks") 
            print("Summation of values - {}".format(x+y) ) 
  
            func(*args, **kwargs) 
              
        return wrapper 
    return Inner 
  
  
# Not using decorator  
def my_fun(*args): 
    for ele in args: 
        print(ele) 
  
# another way of using dacorators 
decorator_func(12, 15)(my_fun)('cafedevn', 'for', 'cafedevn') 
I like cafedevnforcafedevn
Summation of values - 27
cafedevn
for
cafedevn

Ví dụ thứ 4 này cho chúng ta thấy được các tham số của outer function – hàm nằm ở phía ngoài/phía trước (ở đây là hàm decorator_func), có thể được truy cập tới bởi inner function – hàm nằm ở phía bên trong một hàm khác (ở đây chính là hàm Inner).

– Giải thích những gì xảy ra bên trong Decorator

– Giải thích những gì xảy ra bên trong hàm my_fun

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!