Để thực sự tạo các chức năng một cách linh hoạt, bạn có thể sử dụng Makefun, tôi đã phát triển nó chỉ cho điều đó. Nó hỗ trợ ba cách để xác định chữ ký để tạo:
- Một biểu diễn chuỗi, ví dụ
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]
3 - Đối tượng
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]
4, được làm thủ công hoặc có nguồn gốc bằng cách sử dụngdef f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]
5 trên một chức năng khác - một chức năng tham chiếu. Trong trường hợp đó, chữ ký tiếp xúc sẽ giống hệt với chữ ký của hàm này.
Ngoài ra, bạn có thể bảo nó tiêm tham chiếu của chức năng được tạo là đối số đầu tiên trong việc thực hiện của bạn, để có các sửa đổi hành vi nhỏ tùy thuộc vào nơi cuộc gọi đến từ [mặt tiền nào]. Ví dụ:
# generic core implementation
def generic_impl[f, *args, **kwargs]:
print["This is generic impl called by %s" % f.__name__]
# here you could use f.__name__ in a if statement to determine what to do
if f.__name__ == "func1":
print["called from func1 !"]
return args, kwargs
my_module = getmodule[generic_impl]
# generate 3 facade functions with various signatures
for f_name, f_params in [["func1", "b, *, a"],
["func2", "*args, **kwargs"],
["func3", "c, *, a, d=None"]]:
# the signature to generate
f_sig = "%s[%s]" % [f_name, f_params]
# create the function dynamically
f = create_function[f_sig, generic_impl, inject_as_first_arg=True]
# assign the symbol somewhere [local context, module...]
setattr[my_module, f_name, f]
# grab each function and use it
func1 = getattr[my_module, 'func1']
assert func1[25, a=12] == [[], dict[b=25, a=12]]
func2 = getattr[my_module, 'func2']
assert func2[25, a=12] == [[25,], dict[a=12]]
func3 = getattr[my_module, 'func3']
assert func3[25, a=12] == [[], dict[c=25, a=12, d=None]]
Như bạn có thể thấy trong tài liệu, các đối số luôn được chuyển hướng đến
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]6 trừ khi nó hoàn toàn không thể [chữ ký vị trí var như trong
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]7].
- Xây dựng vấn đề
- Phương pháp 1: Exec []
- Phương pháp 2: Nhà máy chức năng
- Phương pháp 3: Mô hình trang trí chức năng
- Phương pháp 4: Đối tượng nhà máy chức năng
Xây dựng vấn đề
Phương pháp 1: Exec []
- Phương pháp 2: Nhà máy chức năng
- Phương pháp 3: Mô hình trang trí chức năng
- Phương pháp 4: Đối tượng nhà máy chức năng
- Có nhiều biến thể khác nhau của vấn đề này mà tất cả đều hỏi điều tương tự:
Làm thế nào để tạo một chức năng động trong Python?
Làm thế nào để xác định một chức năng trong thời gian chạy?
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]
Làm thế nào để xác định một hàm lập trình?
0 1 2 3 4 5 6 7 8 9
Làm thế nào để tạo một hàm từ một chuỗi?
Có nhiều cách để trả lời những câu hỏi này, hầu hết các tài nguyên web cung cấp các giải pháp rất phức tạp không cần thiết, tôi thậm chí không biết họ đang nghĩ gì! Chúng tôi sẽ bắt đầu với giải pháp đơn giản và làm việc theo cách của chúng tôi. 😉
Phương pháp 1: Exec []
Phương pháp 2: Nhà máy chức năng
Phương pháp 3: Mô hình trang trí chức năng
Phương pháp 4: Đối tượng nhà máy chức năng
# Define functions f_0 to f_9 for i in range[10]: exec[f"def f_{i}[]: print[{i}]"] # Run functions f_0 to f_9 for i in range[10]: exec[f"f_{i}[]"]
Có nhiều biến thể khác nhau của vấn đề này mà tất cả đều hỏi điều tương tự:
0 1 2 3 4 5 6 7 8 9
Làm thế nào để tạo một chức năng động trong Python?
>>> dir[] ['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'f_0', 'f_1', 'f_2', 'f_3', 'f_4', 'f_5', 'f_6', 'f_7', 'f_8', 'f_9', 'i']
Làm thế nào để xác định một chức năng trong thời gian chạy?
Làm thế nào để xác định một hàm lập trình?
Làm thế nào để tạo một hàm từ một chuỗi? Python exec[] — A Hacker’s Guide to A Dangerous Function
Có nhiều cách để trả lời những câu hỏi này, hầu hết các tài nguyên web cung cấp các giải pháp rất phức tạp không cần thiết, tôi thậm chí không biết họ đang nghĩ gì! Chúng tôi sẽ bắt đầu với giải pháp đơn giản và làm việc theo cách của chúng tôi. 😉
Phương pháp 2: Nhà máy chức năng
Phương pháp 3: Mô hình trang trí chức năng
# Define factory def factory[argument]: def f[]: print[argument] return f # Define functions functions = [] for i in range[10]: functions.append[factory[i]] # Run functions for f in functions: f[]
Phương pháp 4: Đối tượng nhà máy chức năng
- Có nhiều biến thể khác nhau của vấn đề này mà tất cả đều hỏi điều tương tự:
- Làm thế nào để tạo một chức năng động trong Python?
- Làm thế nào để xác định một chức năng trong thời gian chạy?
Làm thế nào để xác định một hàm lập trình?
# Define factory def factory[argument]: return lambda : print[argument]
Làm thế nào để tạo một hàm từ một chuỗi?
0 1 2 3 4 5 6 7 8 9
Có nhiều cách để trả lời những câu hỏi này, hầu hết các tài nguyên web cung cấp các giải pháp rất phức tạp không cần thiết, tôi thậm chí không biết họ đang nghĩ gì! Chúng tôi sẽ bắt đầu với giải pháp đơn giản và làm việc theo cách của chúng tôi. 😉
Ví dụ: bạn có thể muốn xác định mười hàm
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]8,
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]9, Hồi, F_9 lập trình thực hiện một cái gì đó như in định danh chức năng của nó. Bạn có thể làm như sau:
Phương pháp 3: Mô hình trang trí chức năng
Để hiểu được, tôi nhanh chóng giới thiệu mẫu Bộ trang trí chức năng có thể hữu ích nếu bạn muốn tự động tạo một hàm từ một mẫu trong khi bạn có quyền kiểm soát tuyệt đối số lượng đối số được sử dụng bởi các hàm được tạo động:
def factory[*args, **kwargs]: def f[]: print[args] print[kwargs] return f # Create functions dynamically f_1 = factory['hi', 'Pete'] f_2 = factory[1, 2, 3, alice = 18, bob = 24] f_3 = factory[[1, 2, 3], a=1, b=2, c=3] # Execute functions f_1[] f_2[] f_3[]
Đầu ra là:
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]0
Như bạn có thể thấy, bạn có thể mã hóa cứng, bất kỳ hành vi nào vào chức năng bên trong dựa trên các đối số nhà máy để tùy chỉnh các chức năng được tạo tự động.
Mô hình này thường được sử dụng cho các nhà trang trí chức năng, nhưng nó cũng hoạt động cho vấn đề của chúng tôi.
Phương pháp 4: Đối tượng nhà máy chức năng
Một giải pháp độc ác là tự động khởi động một lớp tùy chỉnh và sử dụng phương thức bên trong để tạo ra một hành vi giống như hàm bằng cách gán tên bên ngoài cho phương thức và sử dụng nó giống như một hàm bình thường:
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]1
Đầu ra giống như trong phương pháp 3 trước đây của chúng tôi:Method 3:
def f_0[]: print[0] def f_1[]: print[1] def f_2[]: print[2] def f_3[]: print[3] def f_4[]: print[4] def f_5[]: print[5] def f_6[]: print[6] def f_7[]: print[7] def f_8[]: print[8] def f_9[]: print[9] f_0[] f_1[] f_2[] f_3[] f_4[] f_5[] f_6[] f_7[] f_8[] f_9[]0
Để biết thêm nền tảng về các lớp học, hãy xem tờ Cheat của chúng tôi:
Liên quan: Python OOP Cheat Sheet: Python OOP Cheat Sheet
Trong khi làm việc như một nhà nghiên cứu trong các hệ thống phân tán, Tiến sĩ Christian Mayer đã tìm thấy tình yêu của mình đối với việc dạy các sinh viên khoa học máy tính.
Để giúp học sinh đạt được thành công cao hơn của Python, ông đã thành lập trang web giáo dục chương trình Finxter.com. Ông là tác giả của cuốn sách lập trình phổ biến Python Oneer [Nostarch 2020], đồng tác giả của loạt sách Break Break Python, những cuốn sách tự xuất bản, người đam mê khoa học máy tính, freelancer và chủ sở hữu của một trong 10 blog Python lớn nhất trên toàn thế giới.
Niềm đam mê của ông là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ tăng cường các kỹ năng của họ. Bạn có thể tham gia học viện email miễn phí của anh ấy ở đây.