Nạp chồng hàm trong python w3schools

Vì vậy, bạn đang viết một chương trình mà bạn cần nhân một số hai số đã cho. Bạn muốn viết một hàm/phương thức cho nó, để tăng tính dễ đọc. Dễ dàng, bạn tạo một hàm nhân hai số

Nhưng sau đó trong chương trình, bạn nhận ra rằng bạn cũng cần nhân 3 số. Hoặc thậm chí có thể đi xa hơn, bạn cần một hàm có thể nhân bất kỳ số lượng đối số nào đã cho

Chà, nếu bạn nhìn từ góc độ của người dùng, họ có thể muốn nhân hai số, hoặc có thể là 3 hoặc 4, v.v. Thậm chí có thể xảy ra trường hợp tại một thời điểm bạn không chỉ muốn nhân hai số, mà thậm chí có thể là hai số thực hoặc một số thực và một số.

Bây giờ hãy để tôi cung cấp cho bạn hai lựa chọn. Đầu tiên, là tạo nhiều hàm như - multi_two [nhân 2 số], multi_three [nhân 3 số], multi_four [nhân 4 số], multi_float [nhân nhiều số float], v.v. hoặc bạn có thể chỉ tạo một hàm

Điều gì có vẻ giống như một lựa chọn thuận tiện hơn? . Tại sao bạn muốn nhớ tất cả các tên chức năng khác nhau. Hoặc, đối với vấn đề đó, tại sao bạn lại muốn tạo nhiều hàm như vậy với các tên khác nhau ngay từ đầu

Bây giờ bạn có thể hỏi, điều đó có khả thi không? . Nó được gọi là nạp chồng phương thức

Quá tải phương thức là gì?

Như chúng ta đã đọc ở trên, bạn không cần tạo nhiều hàm thực hiện cùng một công việc chỉ vì bạn có một bộ tham số khác nhau hoặc các tham số khác nhau hoàn toàn

Bạn muốn làm điều này

def Mul[a: int, b: int]:
	...
	
def Mul[a: int, b: int, c: int]:
	...
	
def Mul[a: float, b: float]:
	...

hơn cái này

def mul_two[a, b]:
	...

def mul_three[a, b, c]:
	...
	
def mul_float[a, b]:
	...

Tại sao?

Nạp chồng phương thức là một phương tiện mà bạn có thể gọi cùng một phương thức theo những cách khác nhau. e. với các tham số khác nhau dựa trên số lượng đối số hoặc kiểu dữ liệu khác nhau của chúng. Giống như chúng tôi đã làm ở trên, chúng tôi gọi cùng một chức năng, Mul với số lượng tham số khác nhau

Tất cả câu chuyện về việc không tạo nhiều chức năng, đã hiểu. Nhưng làm thế nào để chúng ta định nghĩa nạp chồng phương thức?

Nạp chồng phương thức thực chất là một tính năng của ngôn ngữ hướng đối tượng, trong đó chúng ta có thể có hai hoặc nhiều phương thức [hàm] có tên giống nhau nhưng tham số mà chúng lấy làm giá trị đầu vào thì khác nhau. Để cụ thể hơn, có thể có 3 thay đổi được thực hiện đối với các tham số

  • Số lượng tham số có thể khác nhau. Như trong ví dụ của chúng tôi ở trên, một hàm lấy 2 số nguyên để nhân và một hàm khác lấy 3 số nguyên để nhân
  • Kiểu dữ liệu của các tham số có thể khác nhau. Hàm Mul của chúng tôi có thể lấy số nguyên hoặc định nghĩa khác của hàm của chúng tôi nói rằng nó cũng có thể lấy số float làm đầu vào
  • Cách thứ ba để thay đổi các tham số là thay đổi thứ tự của các tham số

Để quá tải thành công một phương thức, điều quan trọng là các phương thức phải có cùng tên. Ví dụ: bạn muốn tính diện tích của các hình dạng khác nhau và với mỗi hình dạng, bạn có các kiểu dữ liệu khác nhau để lưu trữ kích thước của chúng [như kiểu dữ liệu Circle để lưu bán kính hoặc kiểu dữ liệu Square để lưu cạnh hoặc kiểu dữ liệu Rect

Đây là cách mã của bạn có thể trông như thế nào [giả sử rằng các kiểu dữ liệu trên đã được xác định]

Mã này không có trong python, chỉ là một định nghĩa hàm chung được viết để đưa ra ý tưởng về cách quá tải phương thức có thể trông như thế nào

function get_area[Square s]:
	return s.side * s.side
	
function get_area[Circle c]:
	...

function get_area[Rect r]:
	...

Đây là loại quá tải nào?

Quá tải phương thức Python

Bây giờ bạn có thể đã thấy cách chúng tôi thực hiện nạp chồng phương thức, nhưng hãy đi sâu vào chi tiết cụ thể của nó và xem xét các lỗi chúng ta phải tránh, cũng như cách chúng ta có thể thực hiện nạp chồng phương thức trong Python

Trước đó trong bài viết này, chúng ta đã đọc về nạp chồng phương thức là một tính năng của hầu hết các ngôn ngữ lập trình hướng đối tượng. Python cũng vậy, hỗ trợ OOP. Vì vậy, bây giờ trong python nếu bạn muốn tạo một lớp "Thêm" để bạn có thể lấy tổng của bao nhiêu số tùy thích với hàm "my_sum" của mình, bạn biết cách tạo nó. Đây là cách bạn có thể làm cho lớp học của mình trông như thế nào

class Addition:
	# first sum for 2 params
	def my_sum[self, a, b]:
		return a + b
	
	# second overloaded sum for 3 params
	def my_sum[self, a, b, c]:
		return a + b + c

Bây giờ nếu bạn muốn gọi bất kỳ chức năng nào trong số này, trước tiên bạn cần khởi tạo một đối tượng của lớp này "Thêm vào"

Ở đây, biến obj bây giờ là một đối tượng của lớp Addition. Nếu chúng ta muốn gọi bất kỳ chức năng nào, chúng ta sẽ làm như thế này

obj.my_sum[value1, value2]  # for first func
obj.my_sum[val1, val2, val3]  # for second func

Hãy kiểm tra các chức năng này để xem quá tải của chúng tôi có hoạt động không

print[obj.my_sum[3, 4]]
print[obj.my_sum[3, 4, 5]]

đầu ra

Traceback [most recent call last]:
  File "", line 1, in 
TypeError: my_sum[] missing 1 required positional argument: 'c'

12

Huh?

Trong python, không giống như các ngôn ngữ khác, bạn không thể thực hiện nạp chồng phương thức bằng cách sử dụng cùng một tên phương thức. Tại sao?

Mọi thứ đều là một đối tượng trong python, các lớp và thậm chí cả các phương thức. Giả sử bạn có một Bổ sung đối tượng, là một lớp [mọi thứ trong python đều là một đối tượng, vì vậy Bổ sung lớp cũng là một đối tượng]. Nó có một thuộc tính gọi là - my_sum. Đó là thuộc tính duy nhất mà Lớp bổ sung có thể có với tên đó

Vì vậy, khi bạn đang viết def my_sum[. ]. . về cơ bản bạn đã tạo một đối tượng, đây là một phương thức và bạn đang gán nó cho thuộc tính "my_sum" của Bổ sung lớp. Nếu bạn viết hai định nghĩa, thì định nghĩa thứ hai sẽ thay thế định nghĩa đầu tiên, giống như cách mà phép gán đó luôn hoạt động

Giống như trong ví dụ của chúng tôi ở trên, có hai hàm có cùng tên - my_sum. Hàm thứ hai thay thế hàm đầu tiên và đó là lý do tại sao hàm hợp lệ duy nhất mà bạn có thể gọi là my_sum lấy 3 tham số làm đầu vào

Thay vào đó, để thực hiện chức năng tương tự, tôi. e. để đạt được quá tải phương thức, chúng tôi tạo một hàm duy nhất có nhiều tham số. Sau khi làm điều đó, tất cả những gì bạn cần làm là kiểm tra số lượng tham số được lấy làm đầu vào

class Addition:
    def my_sum[self, a = None, b = None, c = None]:
	    s = 0
	    if a != None and b != None and c != None:
			s = a + b + c
		elif a != None and b != None:
			s =  a + b
		return s

Trong đoạn mã trên, chúng tôi đặt 3 biến làm đầu vào, nhưng giá trị mặc định của chúng là Không có. Điều đó có nghĩa là trong khi gọi hàm nếu chúng ta chỉ nhập hai giá trị, thì giá trị thứ ba sẽ được coi là Không theo mặc định và do đó, đầu ra sẽ chỉ là tổng của hai số nguyên được cung cấp làm đầu vào

Vì vậy, về cơ bản, đây là một hàm có khả năng lấy hai hoặc ba tham số làm đầu vào và nó cũng hiển thị các tính năng tương tự của nạp chồng phương thức

Tuy nhiên, đây không phải là phương pháp hiệu quả nhất để thực hiện nạp chồng phương thức, như bạn có thể thấy trong ví dụ trên. Chúng ta có các câu lệnh if elif, trong một mã đơn giản như vậy cho một hàm chỉ trả về tổng của 3 đầu vào [cũng có thể là Không có]. Điều gì sẽ xảy ra nếu bạn tăng số lượng đầu vào bạn muốn?

Nếu hàm của bạn phức tạp hơn hàm này, rất có thể bạn sẽ gặp khó khăn khi viết các câu lệnh if elif để đạt được các tính năng nạp chồng phương thức trong hàm của mình và điều đó làm cho phương thức này không phải là phương thức tốt nhất. Vậy đâu là cách tốt hơn?

Quá tải phương thức trong Python bằng Multipledispatch

Chúng ta đã thấy cách cung cấp chức năng nạp chồng phương thức cho một hàm bằng cách đặt tham số = Không có, tuy nhiên, có một cách khác tốt hơn để làm như vậy. mô-đun. multidispatch có thể được sử dụng để cung cấp cho các chức năng của bạn các tính năng nạp chồng phương thức trong python. [để cài đặt mô-đun, hãy chạy lệnh này - pip3 cài đặt multidispatch trong thiết bị đầu cuối]

Chúng tôi sẽ tạo nhiều chức năng có cùng tên và ngay phía trên chức năng, chúng tôi sẽ thêm một trình trang trí chức năng. [Để tham khảo - Trình trang trí chức năng là công cụ mạnh mẽ trong python. Bằng cách sử dụng chúng, chúng ta có thể sửa đổi hành vi của một hàm hoặc một lớp. ]

Làm thế nào để thêm một chức năng trang trí?

________số 8

Quay lại nạp chồng phương thức trong Python bằng MultiDispatch, chúng ta bọc một hàm khác trong cùng một lớp để mở rộng hành vi của hàm được bọc mà không sửa đổi vĩnh viễn

Nếu bạn không hiểu decorator, hãy google và đọc thêm về chúng, hoặc nếu bạn không muốn, đừng lo, bạn đã hiểu về nạp chồng phương thức. Tiếp tục đọc một số lợi thế của cùng

Đây là cách chúng ta sẽ sử dụng các bộ trang trí để các hàm có các tính năng nạp chồng phương thức

from multidispatch import dispatch  # importing the module

@dispatch[int, int]  # using the dispatch decorator to define two parameters as int
def mul[a, b]:
    return a * b

@dispatch[int, int, int]  # defining 3 parameters as int
def mul[a, b, c]:
    return a * b * c
	
@dispatch[float, float, float]  # defining 3 parameters as float
def mul[a, b, c]:
    return a * b * c

Bạn có thấy rằng tên của tất cả các chức năng đều giống nhau không?

def mul_two[a, b]:
	...

def mul_three[a, b, c]:
	...
	
def mul_float[a, b]:
	...
0

đầu ra

Vì vậy, ở đây, giống như cách chúng ta gọi hàm my_sum trước đây, chúng ta đã gọi hàm mul một cách đơn giản và lần này cung cấp cho nó các tham số khác nhau. Trình trang trí hiện đã xác định các loại dữ liệu cho mọi định nghĩa chức năng được gửi động theo các loại dữ liệu chúng tôi đã đề cập, cũng như số lượng tham số chúng tôi đã đề cập trong trình trang trí

Từ công văn đơn giản có nghĩa là gửi, vì vậy trình trang trí đang gửi các định nghĩa này [những định nghĩa chúng ta đã xác định bằng cách sử dụng trình trang trí] một cách linh hoạt đến các hàm khi chúng được gọi

Ưu điểm của nạp chồng phương thức trong Python

  • Sử dụng quá tải phương thức python, bạn có thể làm cho nhiều phương thức xuất hiện dưới dạng một phương thức duy nhất một cách hợp lý. Ví dụ: các phương thức get_area của chúng tôi, chúng tôi chỉ có một phương thức - get_area có thể được sử dụng để tính diện tích của các hình dạng khác nhau tùy thuộc vào loại đầu vào được cung cấp cho hàm trong khi vẫn thể hiện một cách logic dưới dạng một phương thức. Điều này làm tăng khả năng đọc mã, giúp lập trình viên dễ dàng hơn và cũng tăng hiệu quả viết mã của lập trình viên
  • Nếu chúng ta sử dụng nạp chồng phương thức, chúng ta cũng có thể duy trì khả năng tương thích ngược. Điều đó nghĩa là gì? . Nếu chúng ta thêm một tham số mới [tham số tùy chọn] thì sự hiện diện của tham số đó sẽ được sử dụng để thực hiện các phép tính theo cách cũ hoặc cách mới
  • Quá tải phương thức trong Python cũng cải thiện khả năng sử dụng lại mã

Ở đó. Bây giờ bạn đã biết tất cả về nạp chồng phương thức trong Python. Hãy tóm tắt tất cả các điểm được thảo luận trong bài viết

Nạp chồng hàm trong Python là gì?

Nạp chồng hàm trong Python là gì? . the process where the same function can be used multiple times by passing a different number of parameters as arguments.

Tại sao Python không hỗ trợ nạp chồng hàm?

Giống như các ngôn ngữ khác [ví dụ: nạp chồng phương thức trong C++], python không hỗ trợ nạp chồng phương thức theo mặc định. Nhưng có nhiều cách khác nhau để nạp chồng phương thức trong Python. Vấn đề nạp chồng phương thức trong Python là chúng ta có thể nạp chồng phương thức nhưng chỉ có thể sử dụng phương thức được xác định mới nhất

Chức năng có quá tải tính đa hình trong Python không?

Quá tải phương thức trong Python là một loại Đa hình thời gian biên dịch bằng cách sử dụng mà chúng ta có thể định nghĩa hai hoặc nhiều phương thức trong cùng một lớp có cùng tên nhưng có danh sách tham số khác nhau.

4 loại hàm trong Python là gì?

Sau đây là các loại Hàm Python khác nhau. .
Hàm tích hợp Python
Hàm đệ quy Python
Hàm Lambda trong Python
Các hàm do người dùng định nghĩa trong Python

Chủ Đề