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
- 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
- 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."]
9class 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."]
9class 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."]
0Vì 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
đầ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."]
4Vì 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.