Ghi đè đa hình trong Python

Ghi đè phương thức là một khái niệm của lập trình hướng đối tượng, cho phép chúng ta thay đổi cách thực hiện của một hàm trong lớp con đã được định nghĩa trong lớp cha. Đó là khả năng của một lớp con thay đổi việc triển khai bất kỳ phương thức nào đã được cung cấp bởi một trong các lớp cha [tổ tiên] của nó

Các điều kiện sau phải được đáp ứng để ghi đè một chức năng

  1. Kế thừa nên có. Chức năng ghi đè không thể được thực hiện trong một lớp. Chúng ta cần lấy một lớp con từ một lớp cha
  2. Hàm được định nghĩa lại trong lớp con phải có cùng chữ ký như trong lớp cha i. e. cùng một số tham số

Như chúng ta đã tìm hiểu về khái niệm Kế thừa, chúng ta biết rằng khi một lớp con kế thừa một lớp cha, nó cũng có quyền truy cập vào các biến và phương thức

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
7 và
class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
8[access modifiers in python], ví dụ:

# parent class
class Parent:
    # some random function
    def anything[self]:
        print['Function defined in parent class!']
        
# child class
class Child[Parent]:
    # empty class definition
    pass


obj2 = Child[]
obj2.anything[]

Hàm được định nghĩa trong lớp cha

Trong khi lớp con có thể truy cập các phương thức của lớp cha, nó cũng có thể cung cấp một triển khai mới cho các phương thức của lớp cha, được gọi là ghi đè phương thức

Ví dụ ghi đè phương thức Python

Hãy lấy một ví dụ rất thú vị mà chúng ta cũng đã có trong hướng dẫn thừa kế. Có một lớp cha tên là

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
9

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]

Hãy tạo một lớp con

class Herbivorous[Animal]:
    
    # function feed
	def feed[self]:
	    print["I eat only plants. I am vegetarian."]
0 sẽ mở rộng lớp
class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
9

class Herbivorous[Animal]:
    
    # function feed
	def feed[self]:
	    print["I eat only plants. I am vegetarian."]

Trong lớp con

class Herbivorous[Animal]:
    
    # function feed
	def feed[self]:
	    print["I eat only plants. I am vegetarian."]
0, chúng ta đã ghi đè phương thức
class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
0

Vì vậy, bây giờ khi chúng ta tạo một đối tượng của lớp

class Herbivorous[Animal]:
    
    # function feed
	def feed[self]:
	    print["I eat only plants. I am vegetarian."]
0 và gọi phương thức
class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
0, phiên bản bị ghi đè sẽ được thực thi

Giả sử có một lớp gọi là động vật, nhưng trong lớp đó có rất nhiều dạng như chó, mèo, bò, v.v. Điều đó có nghĩa là một lớp động vật chung bao gồm các dạng khác nhau tồn tại ở nhiều dạng và hình dạng khác nhau và có các chức năng khác nhau. Toàn bộ điều này có thể được định nghĩa bởi một thuật ngữ duy nhất gọi là đa hình. Đa hình trong python là thứ được sử dụng để mô tả khả năng có nhiều dạng khác nhau. Từ này có nguồn gốc từ hai từ khác nhau poly có nghĩa là nhiều và hình thái có nghĩa là hình thức.  

Lớp và đối tượng

Lớp là một kế hoạch chi tiết mà từ đó một đối tượng có thể được tạo ra. Trong ví dụ được đưa ra dưới đây, chúng tôi đã tạo một lớp và đặt tên là A và khai báo một biến x, sau đó một giá trị được truyền vào đó. Một đối tượng được tạo để in giá trị của x

Thí dụ. Một ví dụ đơn giản hiển thị lớp và đối tượng trong python

class A:
  x = 5
object = A[]
print[object.x]

đầu ra

5

Hàm tạo

Constructor là một loại chương trình con trong lập trình hướng đối tượng. Trình xây dựng được sử dụng để gán giá trị cho các thành viên dữ liệu khi một đối tượng được tạo bên trong một lớp. Hàm  __init__[] được sử dụng làm hàm tạo trong python hầu như mỗi khi chúng ta tạo một đối tượng. Trong tính đa hình, chúng tôi sử dụng chức năng __init__[] này ở hầu hết mọi nơi

Tính đa hình trong Python là gì?

Đa hình trong python được dùng chung cho một tên hàm có thể dùng cho nhiều kiểu khác nhau. Khái niệm này được áp dụng rộng rãi trong lập trình python dựa trên hướng đối tượng. Giống như các ngôn ngữ lập trình khác như Java, C+, tính đa hình cũng được triển khai trong python cho các mục đích khác nhau, thường là Duck Typing, Nạp chồng toán tử và Nạp chồng phương thức và Ghi đè phương thức. Quá trình đa hình này có thể đạt được theo hai cách chính là quá tải và ghi đè.  

Một ví dụ đơn giản về tính đa hình trong python

>>>4+5

9

>>>”4”+”5”

45

>>>”ab”+”cd”

A B C D

Trong ví dụ trên, chúng ta có thể thấy rõ rằng toán tử cộng được sử dụng theo cách khác.   

Trong ví dụ đầu tiên, vì dữ liệu được gửi là hai giá trị nguyên, toán tử đã thực hiện phép toán cộng hai số.  

Và trong ví dụ thứ hai, vì các giá trị giống nhau được gửi dưới dạng dữ liệu ở dạng chuỗi và cùng một toán tử đã thực hiện nối [ghép nối là quá trình nối hai chuỗi từ đầu đến cuối] của hai chuỗi.  

Trong ví dụ thứ ba, dữ liệu được gửi là hai chuỗi nhưng toán tử giống như trên và nó thực hiện nối hai chuỗi

>>>”3”+”ab”

3ab

Trong ví dụ này, toán tử cộng đã thực hiện nối hai chuỗi mặc dù giá trị đầu tiên là một số nguyên nhưng ở đây trong ví dụ cụ thể này, nó được gửi dưới dạng chuỗi.  

Vì vậy, đây là một vài ví dụ cơ bản về tính đa hình trong python

Làm thế nào để sử dụng đa hình?

quá tải

Quá tải được chia thành hai loại

  • Quá tải toán tử
  • Quá tải phương thức

Quá tải toán tử

Nạp chồng toán tử là kiểu nạp chồng trong đó một toán tử có thể được sử dụng theo nhiều cách ngoài ý nghĩa được xác định trước của nó

>>>in[2*7]

14

>>>in[”a”*3]

aa

Vì vậy, trong ví dụ trên, toán tử nhân đã thực hiện phép nhân hai số trong số đầu tiên, nhưng trong số thứ hai, vì phép nhân của một chuỗi và một số nguyên là không thể nên ký tự  được in lặp lại 3 lần. Vì vậy, nó cho thấy cách chúng ta có thể sử dụng một toán tử theo cách khác

Thực hành quá tải toán tử

ví dụ 1

class Vehicle:
    def __init__[self, fare]:
        self.fare = fare

bus= Vehicle[20]
car= Vehicle[30]
total_fare=bus+ car
print[total_fare]

đầu ra

Traceback [cuộc gọi gần đây nhất cuối cùng]

  File “G:\python pycharm project\main.py”, line 7, in

total_fare=xe buýt+xe hơi

LoạiLỗi. [các] loại toán hạng không được hỗ trợ cho +. 'Xe' và 'Xe'

Ở đây trong ví dụ trên đã xảy ra lỗi, điều này là do python không biết cách thêm hai đối tượng lại với nhau. Ở đây Xe là đối tượng.  

Bây giờ đến phần ứng dụng nạp chồng toán tử đây.  

Bây giờ chúng ta sẽ nạp chồng toán tử __add__  hàm đặc biệt

class Vehicle:
    def __init__[self, fare]:
        self.fare = fare
    def __add__[self, other]://using the special function __add__ operator
        return self.fare+ other.fare

bus= Vehicle[20]
car= Vehicle[30]
total_fare=bus+ car
print[total_fare]

đầu ra

50

Quá tải chức năng đặc biệt xác định một cách kỳ diệu mỗi khi chúng tôi sử dụng  toán tử cộng trong đối tượng total_fare=bus+ car  chúng tôi sẽ thêm giá vé của chúng
Ví dụ 2. Hãy để chúng tôi so sánh giá vé của các phương tiện khác nhau trong ví dụ này

________số 8

đầu ra

Thật

__lt__  Đó là toán tử quan hệ được sử dụng như một hàm đặc biệt để nạp chồng toán tử trong ví dụ trên

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

Nạp chồng phương thức có nghĩa là một lớp chứa nhiều phương thức có cùng tên nhưng có thể có các đối số khác nhau. Về cơ bản python không hỗ trợ nạp chồng phương thức, nhưng có một số cách để nạp chồng phương thức. Mặc dù có thể đạt được quá tải phương thức, nhưng chỉ có thể sử dụng được các phương thức được xác định cuối cùng

Hãy lấy một ví dụ để hiểu rõ hơn

Hãy xem xét một lớp A, trong lớp chúng ta đã thực hiện một hàm show có một hàm tạo và các đối số có giá trị mặc định được gán là Không có và Không có. Sau đó, tôi đã tạo một đối tượng và gọi hàm với đối tượng obj. hiển thị, nhưng tôi đã không chuyển bất kỳ đối số nào mặc dù nó sẽ in Không và Không vì trong phần hàm chúng tôi đã gán các giá trị mặc định

Thí dụ

class A:
    def show[self, a=None, b=None]:
        print[a,b]

obj=A[]
obj.show[]

đầu ra

Không  Không

Bây giờ nếu tôi muốn chuyển bất kỳ giá trị nào khác thì tôi phải gọi hàm khác obj. show[] với một đối số trong đó

Thí dụ

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
0

đầu ra

Không có Không có

4 Không có

Ở đây, trong đầu ra, giá trị Không được gán cho a trong phần chức năng được thay thế bằng 4. Trong phần gọi hàm, phần 4 được truyền dưới dạng đối số

Bây giờ nếu chúng ta truyền hai đối số trong khi gọi hàm, hãy xem điều gì sẽ xảy ra trong ví dụ tiếp theo,

Thí dụ

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
1

đầu ra

Không có Không có

4

4 5

Ở đây khi chúng ta truyền hai đối số 4 và 5 trong khi gọi hàm, hai giá trị khác nhau được gán cho a và b

Vì vậy, trong ví dụ trên, chúng ta đã thấy cách chúng ta có thể sử dụng cùng một phương thức và sử dụng các lệnh gọi hàm khác nhau theo những cách khác nhau

Hãy xem một ví dụ khác mà chúng ta đã sử dụng các câu điều kiện để gọi các hàm khác nhau theo những cách khác nhau

Thí dụ

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
2

đầu ra

Không có con số được chỉ định

Quảng trường. 100

hình chữ nhật. 200

Trong ví dụ trên nếu không có đối số nào được truyền trong khi gọi hàm thì nó sẽ không hiển thị giá trị được gán, nếu chúng ta truyền 1 đối số thì nó sẽ hiển thị diện tích hình vuông và nếu 2 giá trị được truyền vào thì nó sẽ hiển thị diện tích hình chữ nhật

Di sản

Trước khi tìm hiểu về Ghi đè phương thức, chúng ta cần biết Kế thừa đầu tiên trong python. Kế thừa là quá trình mà qua đó một lớp có thể được dẫn xuất từ ​​bất kỳ lớp cơ sở nào mà qua đó lớp dẫn xuất có thể kế thừa tất cả các thuộc tính từ lớp cơ sở. Kế thừa làm giảm vấn đề viết đi viết lại cùng một mã và tăng khả năng sử dụng lại

Ví dụ về thừa kế

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
3

đầu ra

Chim sẻ tweet
Tiếng chim
Ghi đè phương thức

Ghi đè phương thức là quá trình sửa đổi một lớp cơ sở từ lớp dẫn xuất có cùng phương thức và cùng số đối số

Hãy lấy một ví dụ và xem nó hoạt động như thế nào. Trước hết chúng ta sẽ tạo một lớp cơ sở với một phương thức và sau đó tạo một lớp dẫn xuất không có bất kỳ phương thức nào,

Thí dụ

class Animal:
    # properties
	multicellular = True
	# Eukaryotic means Cells with Nucleus
	eukaryotic = True
	
	# function breathe
	def breathe[self]:
	    print["I breathe oxygen."]
    
    # function feed
	def feed[self]:
	    print["I eat food."]
4

Vì vậy, khi hàm được gọi, đầu ra sẽ in phương thức của lớp cơ sở, vì lớp dẫn xuất không có phương thức nào trong đó.  

đầu ra

Tiết kiệm năng lượng

Bây giờ trong ví dụ tiếp theo, chúng ta khai báo một phương thức khác trong lớp dẫn xuất có cùng tên với lớp cơ sở nhưng với đối số khác. Vì phương thức của lớp cơ sở hiện đã bị lớp dẫn xuất ghi đè nên chỉ có phương thức của lớp dẫn xuất sẽ được in dưới dạng đầu ra

Thí dụ

class Vehicle:
    def __init__[self, fare]:
        self.fare = fare

bus= Vehicle[20]
car= Vehicle[30]
total_fare=bus+ car
print[total_fare]
0

đầu ra

Chạy bằng điện

Hàm siêu []

Bây giờ như thể phương thức của lớp cơ sở đã bị ghi đè, phương thức từ lớp cơ sở không thể được gọi bình thường. Vì vậy, để gọi phương thức của lớp cơ sở, chúng ta phải sử dụng siêu hàm trong phương thức được ghi đè bên dưới lớp dẫn xuất

Thí dụ

class Vehicle:
    def __init__[self, fare]:
        self.fare = fare

bus= Vehicle[20]
car= Vehicle[30]
total_fare=bus+ car
print[total_fare]
1

đầu ra

Tiết kiệm năng lượng

Chạy bằng điện

gõ vịt

Gõ vịt là một khái niệm trong đa hình. Thuật ngữ gõ vịt bắt nguồn từ câu trích dẫn nói rằng thứ gì đó đi như vịt kêu quạc quạc như vịt và bơi như vịt được gọi là vịt cho dù đó là vật gì. Nói một cách đơn giản, nó có nghĩa là thứ gì đó phù hợp với hành vi của nó với bất kỳ thứ gì, sau đó nó sẽ xem xét một thứ thuộc danh mục mà nó phù hợp.

Tại sao đa hình cần thiết?

Khi nói về lập trình hướng đối tượng trong python, thuật ngữ đa hình chắc chắn sẽ xuất hiện. Trong lập trình hướng đối tượng, các đối tượng cần có các dạng khác nhau. Trong phát triển phần mềm, tính năng này khá quan trọng. Thông qua tính đa hình, một hành động có thể được thực hiện theo nhiều cách khác nhau. Khái niệm này được sử dụng rộng rãi khi chúng ta nói về khớp nối lỏng lẻo, tiêm phụ thuộc và giao diện, v.v.

Quá tải đa hình trong Python là gì?

Đó là một khái niệm trong lập trình Python trong đó một đối tượng được định nghĩa trong Python có thể được sử dụng theo nhiều cách khác nhau . Nó cho phép lập trình viên định nghĩa nhiều phương thức trong một lớp dẫn xuất và nó có cùng tên như hiện tại trong lớp cha. Các kịch bản như vậy hỗ trợ quá tải phương thức trong Python.

Ghi đè trong Python là gì?

Ghi đè phương thức trong Python là gì?

Tại sao Ghi đè phương thức là đa hình thời gian chạy trong Python?

Tính đa hình trong thời gian chạy không là gì ngoài việc ghi đè phương thức. Nó hoạt động song song với tính kế thừa . Ghi đè phương thức là khái niệm trong đó mặc dù tên phương thức và các tham số được truyền giống nhau, hành vi sẽ khác nhau dựa trên loại đối tượng.

Làm thế nào đa hình đạt được trong Python?

Giống như trường hợp của các ngôn ngữ lập trình khác như Java và C++, tính đa hình được triển khai trong Python cho nhiều mục đích khác nhau, đáng chú ý nhất là Duck Typing, Toán tử và Phương thức nạp chồng và Ghi đè phương thức. Tính đa hình này có thể được thực hiện theo hai cách riêng biệt. quá tải và ghi đè .

Chủ Đề