Trang trí trong Python
Python có một tính năng thú vị gọi là các nhà trang trí để thêm chức năng vào một mã hiện có.decorators to add functionality to an existing code.
Điều này cũng được gọi là metaprogramming vì một phần của chương trình cố gắng sửa đổi một phần khác của chương trình tại thời điểm biên dịch.metaprogramming because a part of the program tries to modify another part of the program at compile time.
Điều kiện tiên quyết cho các nhà trang trí học tập
Để hiểu về các nhà trang trí, trước tiên chúng ta phải biết một vài điều cơ bản trong Python.
Chúng ta phải thoải mái với thực tế là mọi thứ trong Python [vâng! Ngay cả các lớp học], là đối tượng. Tên mà chúng tôi xác định chỉ đơn giản là các định danh bị ràng buộc với các đối tượng này. Các hàm không phải là ngoại lệ, chúng cũng là đối tượng [với các thuộc tính]. Các tên khác nhau có thể được liên kết với cùng một đối tượng chức năng.
Đây là một ví dụ.
def first[msg]:
print[msg]
first["Hello"]
second = first
second["Hello"]
Đầu ra
Hello Hello
Khi bạn chạy mã, cả hai chức năng
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
3 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
4 cung cấp cùng một đầu ra. Ở đây, các tên def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
3 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
4 đề cập đến cùng một đối tượng hàm.Bây giờ mọi thứ bắt đầu trở nên kỳ quặc hơn.
Các chức năng có thể được truyền dưới dạng đối số cho một chức năng khác.
Nếu bạn đã sử dụng các hàm như
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
7, def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
8 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
9 trong Python, thì bạn đã biết về điều này.Các chức năng như vậy lấy các chức năng khác làm đối số còn được gọi là các hàm bậc cao hơn. Dưới đây là một ví dụ về một chức năng như vậy.higher order functions. Here is an example of such a function.
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
Chúng tôi gọi các chức năng như sau.
>>> operate[inc,3]
4
>>> operate[dec,3]
2
Hơn nữa, một hàm có thể trả về một chức năng khác.
def is_called[]:
def is_returned[]:
print["Hello"]
return is_returned
new = is_called[]
# Outputs "Hello"
new[]
Đầu ra
Hello
Hello Hello
Khi bạn chạy mã, cả hai chức năng
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
3 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
4 cung cấp cùng một đầu ra. Ở đây, các tên def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
3 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
4 đề cập đến cùng một đối tượng hàm.Bây giờ mọi thứ bắt đầu trở nên kỳ quặc hơn.
Các chức năng có thể được truyền dưới dạng đối số cho một chức năng khác.callable as they can be called.
Nếu bạn đã sử dụng các hàm như
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
7, def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
8 và def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
9 trong Python, thì bạn đã biết về điều này.Các chức năng như vậy lấy các chức năng khác làm đối số còn được gọi là các hàm bậc cao hơn. Dưới đây là một ví dụ về một chức năng như vậy.
def make_pretty[func]:
def inner[]:
print["I got decorated"]
func[]
return inner
def ordinary[]:
print["I am ordinary"]
Chúng tôi gọi các chức năng như sau.
>>> ordinary[]
I am ordinary
>>> # let's decorate this ordinary function
>>> pretty = make_pretty[ordinary]
>>> pretty[]
I got decorated
I am ordinary
Hơn nữa, một hàm có thể trả về một chức năng khác.
pretty = make_pretty[ordinary]
Ở đây,
>>> operate[inc,3]
4
>>> operate[dec,3]
2
0 là một hàm lồng nhau được xác định và trả về mỗi lần chúng tôi gọi >>> operate[inc,3]
4
>>> operate[dec,3]
2
1.Cuối cùng, chúng ta phải biết về việc đóng cửa trong Python.
Trở lại với các nhà trang trí
ordinary = make_pretty[ordinary].
Các chức năng và phương thức được gọi là có thể gọi vì chúng có thể được gọi.
Trong thực tế, bất kỳ đối tượng nào thực hiện phương thức
>>> operate[inc,3]
4
>>> operate[dec,3]
2
2 đặc biệt đều được gọi là có thể gọi được. Vì vậy, theo nghĩa cơ bản nhất, một người trang trí là một người có thể gọi được trả về một người có thể gọi được.Hello Hello0
Về cơ bản, một người trang trí có chức năng, thêm một số chức năng và trả lại nó.
Hello Hello1
Khi bạn chạy các mã sau trong shell,
Trong ví dụ được hiển thị ở trên, >>> operate[inc,3]
4
>>> operate[dec,3]
2
3 là một người trang trí. Trong bước chuyển nhượng:
>>> operate[inc,3]
4
>>> operate[dec,3]
2
Hàm
>>> operate[inc,3]
4
>>> operate[dec,3]
2
4 được trang trí và hàm trả về được đặt tên >>> operate[inc,3]
4
>>> operate[dec,3]
2
5.Hello Hello2
Chúng ta có thể thấy rằng chức năng trang trí đã thêm một số chức năng mới vào chức năng ban đầu. Điều này tương tự như đóng gói một món quà. Các nhà trang trí hoạt động như một trình bao bọc. Bản chất của đối tượng được trang trí [món quà thực tế bên trong] không thay đổi. Nhưng bây giờ, nó trông rất đẹp [vì nó đã được trang trí].
Hello Hello3
Nói chung, chúng tôi trang trí một chức năng và gán lại nó là,
Hello Hello4
Đây là một cấu trúc phổ biến và vì lý do này, Python có một cú pháp để đơn giản hóa điều này.
Hello Hello5
Chúng ta có thể sử dụng biểu tượng
>>> operate[inc,3]
4
>>> operate[dec,3]
2
6 cùng với tên của hàm trang trí và đặt nó lên trên định nghĩa của hàm được trang trí. Ví dụ,tương đương với
Đây chỉ là một đường cú pháp để thực hiện trang trí.
Hello Hello6
Chức năng trang trí với các thông số
Các nhà trang trí trên rất đơn giản và nó chỉ hoạt động với các chức năng không có bất kỳ thông số nào. Điều gì sẽ xảy ra nếu chúng ta có các chức năng có trong các tham số như:
Hàm này có hai tham số, a và b. Chúng tôi biết nó sẽ gây ra lỗi nếu chúng tôi vượt qua B là 0.
Hello Hello7
Đầu ra
Hello Hello8
Hello Hello
Hello Hello9
Về cơ bản, một người trang trí có chức năng, thêm một số chức năng và trả lại nó.
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
0Khi bạn chạy các mã sau trong shell,
def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
1Trong ví dụ được hiển thị ở trên,
>>> operate[inc,3]
4
>>> operate[dec,3]
2
3 là một người trang trí. Trong bước chuyển nhượng:def inc[x]:
return x + 1
def dec[x]:
return x - 1
def operate[func, x]:
result = func[x]
return result
2