Contents

Tìm hiểu về nạp chồng hàm trong Python

Nạp chồng hàm là một tính năng trong một số ngôn ngữ lập trình cho phép bạn xác định các biến thể của cùng một hàm. Mỗi biến thể có cùng tên, nhưng cách triển khai khác nhau, với các chữ ký chức năng duy nhất.

Phương pháp này cho phép thực hiện các hành động khác nhau tùy thuộc vào tính chất và số lượng tham số được truyền đến một hàm, cho phép lập trình linh hoạt hơn.

Python khác với các ngôn ngữ lập trình như C++ và Java ở chỗ nó không hỗ trợ nạp chồng hàm. Tuy nhiên, người ta có thể mô phỏng chức năng này thông qua các phương tiện thay thế.

Python xử lý tình trạng quá tải hàm như thế nào?

Trong Python, một hàm có thể được xác định nhiều lần với các thông số tham số và/hoặc kiểu dữ liệu khác nhau. Tuy nhiên, khi gọi hàm, Python sẽ chỉ thừa nhận phiên bản cuối cùng của định nghĩa của nó. Một trường hợp điển hình được trình bày dưới đây:

 def arithmetics(a, b):
    return a - b

def arithmetics(a, b, c, d):
    return a \+ b - c * d

print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error

Các ngôn ngữ lập trình hướng đối tượng như Java thường xuyên kết hợp các cơ chế nạp chồng hàm và phương thức. Về bản chất, các phương thức là các hàm được mô tả trong ngữ cảnh của một lớp.

Trong đoạn mã nói trên, trình thông dịch Python sẽ chỉ xác nhận định nghĩa được khai báo sau này của hàm số học() khi cố gắng gọi nó trong một dự án. Nếu một người cố gắng gọi hàm với hai tham số nhất quán với khai báo ban đầu của nó, một ngoại lệ sẽ xuất hiện cho biết rằng (các) đối số đã nói bị thiếu và cần thiết để thực thi.

/vi/images/missing-positional-argument-error.jpg

Lỗi chức năng không xảy ra khi bốn tham số được cung cấp trong quá trình gọi, điều này cho biết rằng chức năng đã được thay thế bằng phiên bản mới nhất của nó trong bộ nhớ. Tuy nhiên, đây không phải là biểu hiện của việc nạp chồng phương thức và cần có một cách tiếp cận khác để giải quyết.

Python vốn không hỗ trợ nạp chồng hàm; tuy nhiên, người ta có thể sử dụng một số kỹ thuật nhất định trong mã của họ để mô phỏng chức năng này.

Cách 1: Sử dụng tham số tùy chọn hoặc đối số mặc định

Người ta có thể thực hiện quá tải thông qua việc thực hiện các hàm với các tham số mặc định. Một ví dụ minh họa như sau:

 def arithmetics(a, b=0, c=0):
    """
    Arguments:
    a: The first number.
    b: The second number (optional).
    c: The third number (optional).
    """
    return a - b \+ c

Hàm đã cho bao gồm tổng cộng ba biến đầu vào, tuy nhiên hai trong số đó có các giá trị được xác định trước. Do đó, điều này cho phép gọi hàm với một mảng từ một đến ba phần tử đối số.

 print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11

Mặc dù phương pháp này trình bày nhiều cách khác nhau để gọi hàm, nhưng cuối cùng nó lại chứng tỏ là một giải pháp không bền vững do một số hạn chế cố hữu.

Đối số được truyền phải có kiểu là số nguyên hoặc số float.

Dường như không có sự thay đổi rõ ràng nào về chức năng của chức năng cụ thể này. Do đó, nó vẫn không thể thực hiện các tác vụ như tính diện tích của một hình nhất định hoặc in văn bản “Xin chào thế giới”.

Cách 2: Sử dụng đối số biến

Để sử dụng tính năng nạp chồng đối số biến trong Python, điều cần thiết là phải kết hợp tham số “args” trong khi xác định hàm. Thuộc tính này cho phép truyền nhiều đối số vị trí trong quá trình gọi hàm. Một cuộc trình diễn mẫu có thể được tìm thấy dưới đây:

 def arithmetics(a, *args):
    """
    Arguments:
    a: The first number.
    *args: A variable number of arguments (optional).
    """
    args_sum = 0

    for num in args:
        args_sum *= num

    return a - args_sum

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10

Hàm nói trên yêu cầu hai tham số; một tham số bắt buộc được chỉ định là “a” và một tham số tùy chọn được gọi là “args”, cho phép bao gồm bất kỳ số lượng đối số bổ sung nào nếu cần.

Mặc dù có khả năng chấp nhận nhiều đầu vào, nhưng hàm cụ thể này bị hạn chế ở khả năng thực hiện các phép tính số học ngoài phép nhân đơn giản, vì nó chỉ áp dụng quy trình nhân cho các biến được biểu thị bằng từ khóa args .

Để thực thi một loạt hành động trong ngữ cảnh có lập trình, thường cần phải kết hợp các câu lệnh có điều kiện trong mã của một người. Tuy nhiên, khi số lượng điều kiện được xem xét tăng lên thì độ phức tạp của nhiệm vụ lập trình cũng tăng theo.

Cách 3: Sử dụng Multiple Dispatch Decorator

Trình trang trí nhiều công văn là một thư viện Python cho phép tạo nhiều triển khai hoặc phiên bản khác nhau của một hàm đơn lẻ tùy thuộc vào loại đầu vào mà nó nhận được. Bằng cách đó, người ta có thể thiết lập các chức năng giống hệt nhau với cấu trúc dữ liệu khác nhau và thay đổi hoàn toàn hoạt động của chúng.

Để sử dụng trang trí gửi văn bản đa phương thức, hãy tuân thủ các giao thức sau:

⭐ Cài đặt multipledispath trong môi trường Python của bạn:

 pip install multipledispatch

⭐ Trang trí (các) chức năng của bạn bằng công cụ trang trí @dispatch. Trình trang trí @dispatch là một trình trang trí Python cho phép bạn triển khai nhiều công văn. Nó sẽ tự động gửi hàm thích hợp dựa trên các đối số bạn truyền cho nó. Bạn có thể sử dụng trang trí @dispatch bằng cách làm theo mẫu sau:

 from multipledispatch import dispatch

@dispatch(data type1, data type2, data typeX)
def your_function(a, b, c, x):
    pass
    # perform your operations here

Hãy xem xét một kịch bản trong đó chúng tôi sử dụng trình trang trí nhiều công văn để tạo điều kiện thuận lợi cho khái niệm nạp chồng hàm trong ngôn ngữ lập trình Python:

 from multipledispatch import dispatch

@dispatch(int, int)
def add(a, b):
    """
    Arguments:
    a: Any integer.
    b: Any integer.
    """
    return a \+ b

@dispatch(int, list)
def add(a, b):
    """
    Arguments:
    a: Any integer.
    b: Any Python list.
    """
    b.append(a)
    return b

# returns 3
print(add(1, 2))

# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done'])) 

Đoạn mã nói trên khởi tạo hai lần xuất hiện riêng biệt của hàm add(), với mỗi lần xuất hiện tương ứng sẽ chấp nhận và xử lý các tham số riêng biệt. Cụ thể, một phiên bản như vậy nhận và tính tổng của hai giá trị số được biểu thị dưới dạng kiểu dữ liệu số nguyên, cuối cùng mang lại tổng kết quả theo kết quả của phép tính số học.

Theo kiểu xen kẽ, lần lặp tiếp theo của thao tác này bao gồm việc chấp nhận hai tham số; một số nguyên và một tập hợp tuần tự. Sau đó, tham số nói trên sẽ được thêm vào cuối chuỗi và được trả về dưới dạng tích lũy đã sửa đổi.

/vi/images/using-the-dispatch-decorator-for-method-overloading.jpg

Cách tiếp cận nạp chồng hàm trong Python này mang lại cho bạn rất nhiều tính linh hoạt, đặc biệt nếu bạn cần thay đổi hành vi của phương thức của mình. Bạn có thể tìm hiểu thêm từ tài liệu gửi nhiều lần.

Cách tiếp cận tốt nhất đối với việc nạp chồng hàm trong Python

Việc lựa chọn một phương pháp thích hợp để xử lý quá tải chức năng phải phù hợp với mục tiêu dự định của một người. Trong trường hợp có thể đạt được kết quả mong muốn thông qua việc sử dụng các đối số mặc định hoặc biến, có thể không cần thiết phải sử dụng trình trang trí đa công văn. Tuy nhiên, trong hầu hết các trường hợp, giải pháp sau thể hiện mình là một giải pháp hiệu quả và chính xác hơn nhờ khả năng đáp ứng nhiều loại đối số khác nhau trong khi vẫn duy trì hiệu suất tối ưu.

Trình trang trí được cung cấp cung cấp một cách tiếp cận tinh tế và linh hoạt để triển khai nạp chồng hàm trong ngôn ngữ lập trình Python. Nó cho phép tạo ra nhiều cách triển khai khác nhau của một chức năng đơn độc, phụ thuộc vào đặc điểm của các tham số của nó.

Việc sử dụng phương pháp này cho phép phát triển các hàm linh hoạt có khả năng chứa nhiều loại tham số khác nhau, loại bỏ yêu cầu về các câu lệnh điều kiện phức tạp để đạt được khả năng thích ứng như vậy.