Vấn đề với ghi đè phương thức trong python là gì?

Ghi đè phương thức là một tính năng của lập trình hướng đối tượng cho phép bạn thay đổi hành vi của các phương thức kế thừa theo nhu cầu cụ thể của chúng tôi. Ở đây, phương thức trong lớp dẫn xuất có cùng tên và cùng số đối số với lớp cơ sở

Phương thức của lớp cơ sở được gọi là phương thức ghi đè và phương thức của lớp dẫn xuất được gọi là phương thức ghi đè

#Python program to implement method overriding
class Animal:
   def sound(self):
      print('Animal makes sound.')

class Dog(Animal):
   def sound(self):
      print('Dog barks.')

d = Dog()
d.sound()

Đầu ra của chương trình trên

Dog barks.

Trong đoạn mã trên, bạn có thể thấy lớp

Dog barks.
13 là lớp con của lớp
Dog barks.
14. Lớp
Dog barks.
13 đã ghi đè phương thức
Dog barks.
1 của lớp
Dog barks.
14. Khi chúng ta gọi phương thức
Dog barks.
1 bằng cách sử dụng đối tượng lớp
Dog barks.
13 thì "Dog sủa" được in ra thay vì "Động vật tạo ra âm thanh"

Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách sử dụng phương thức ghi đè Python để cho phép lớp con cung cấp triển khai cụ thể của phương thức được cung cấp bởi một trong các lớp cha của nó

Giới thiệu về phương thức ghi đè Python

Phương thức ghi đè cho phép một lớp con cung cấp một triển khai cụ thể của một phương thức đã được cung cấp bởi một trong các lớp cha của nó

Hãy lấy một ví dụ để hiểu rõ hơn về phương thức ghi đè

Đầu tiên, định nghĩa lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)

Lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8 có hai biến thể hiện

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
0 và

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1. Nó cũng có phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 trả về

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1

Thứ hai, định nghĩa

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4 kế thừa từ lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)

Lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4 có ba thuộc tính thể hiện.

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
0,

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1 và

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
9

Thứ ba, tạo một phiên bản mới của lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4 và hiển thị khoản thanh toán

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)

đầu ra

Dog barks.
0

Phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 chỉ trả về

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1, không phải tổng của

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1 và

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
9

Khi bạn gọi

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 từ thể hiện của lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4, Python thực thi phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 của lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8, phương thức này trả về

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
1

Để đưa phần thưởng bán hàng vào lương, bạn cần định nghĩa lại phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 trong lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4 như sau

Dog barks.
2

Trong trường hợp này, chúng ta nói rằng phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 trong lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4 ghi đè phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 trong lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8

Khi bạn gọi phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 của đối tượng

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4, Python sẽ gọi phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 trong lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)

đầu ra

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
2

Nếu bạn tạo một thể hiện của lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8, Python sẽ gọi phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 của lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8, không phải phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
2 của lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
4. Ví dụ

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
8

Đặt nó tất cả cùng nhau

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
9

Ví dụ ghi đè phương thức nâng cao

Sau đây định nghĩa lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
1

Lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 có thuộc tính

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
7 chỉ định một đoạn văn bản sẽ được phân tích cú pháp. Ngoài ra, lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 có ba phương thức

  • Phương thức

    john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

    Code language: Python (python)
    9 phân tích văn bản và trả về email
  • Phương thức

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    20 phân tích văn bản và trả về một số điện thoại ở định dạng

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    21 trong đó

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    22 là một số từ 0 đến 9 e. g. ,

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    23
  • Phương thức

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    24 trả về một từ điển chứa hai phần tử

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    25 và

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    26. Nó gọi phương thức

    john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

    Code language: Python (python)
    9 và

    class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

    Code language: Python (python)
    20 để trích xuất email và điện thoại từ thuộc tính

    john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

    Code language: Python (python)
    7

Sau đây sử dụng lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 để trích xuất email và điện thoại

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
0

đầu ra

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
1

Giả sử bạn cần trích xuất số điện thoại ở định dạng

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
81, đây là định dạng số điện thoại của Vương quốc Anh. Ngoài ra, bạn muốn sử dụng email trích xuất như lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5

Để làm điều đó, bạn có thể định nghĩa một lớp mới có tên là

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83 kế thừa từ lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5. Trong lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83, bạn override phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 như sau

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
2

Sau đây sử dụng lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83 để trích xuất số điện thoại (ở định dạng Vương quốc Anh) và email từ văn bản

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
3

đầu ra

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
4

Trong ví dụ này,

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
88 gọi phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24 từ lớp cha là lớp Parser. Đổi lại, phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24 gọi các phương thức

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
9 và

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20

Tuy nhiên,

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
93 không gọi phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 của lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 mà gọi phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 của lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
5

Lý do là bên trong phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24,

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
99 là

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
88 là một thể hiện của lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83

Do đó, khi bạn gọi phương thức

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
12 bên trong phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24, Python sẽ tìm kiếm phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 được liên kết với thể hiện của

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83

Đặt nó tất cả cùng nhau

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
6

Thuộc tính ghi đè

Phần sau đây cho thấy cách triển khai các lớp Trình phân tích cú pháp và UkParser bằng cách ghi đè các thuộc tính

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
7

Trong ví dụ này,

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 có biến lớp

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
17. Phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 trong lớp

john = SalesEmployee('John', 5000, 1500) print(john.get_pay())

Code language: Python (python)
5 sử dụng

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
17 để trích xuất một số điện thoại

Lớp con

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83 xác định lại (hoặc ghi đè) thuộc tính lớp

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
17

Nếu bạn gọi phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24 từ thể hiện của

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83, thì phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
24 sẽ gọi phương thức

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
20 sử dụng

class Employee: def __init__(self, name, base_pay): self.name = name self.base_pay = base_pay def get_pay(self): return self.base_pay

Code language: Python (python)
17 được định nghĩa trong lớp

class SalesEmployee(Employee): def __init__(self, name, base_pay, sales_incentive): self.name = name self.base_pay = base_pay self.sales_incentive = sales_incentive

Code language: Python (python)
83

Tại sao không thể ghi đè trong Python?

Trong Python việc ghi đè phương thức xảy ra bằng cách đơn giản định nghĩa trong lớp con một phương thức có cùng tên với phương thức trong lớp cha . Khi bạn xác định một phương thức trong đối tượng, bạn làm cho phương thức sau có thể đáp ứng lệnh gọi phương thức đó, do đó, việc triển khai các tổ tiên của nó không phát huy tác dụng.

Có thể ghi đè phương thức trong Python không?

Nếu bạn muốn ghi đè phương thức của Lớp cha, hãy tạo một hàm trong Lớp con có cùng tên và số lượng tham số . Đây được gọi là chức năng ghi đè trong Python.

Tại sao Python không hỗ trợ nạp chồng phương thức?

Khi bộ thực thi gặp một hàm khác có cùng tên, bộ thực thi sẽ cập nhật mục nhập trong không gian tên cục bộ và do đó loại bỏ khả năng hai hàm cùng tồn tại . Do đó python không hỗ trợ Nạp chồng hàm.

Tại sao chúng ta sử dụng ghi đè phương thức trong Python?

Ghi đè phương thức là một khả năng của bất kỳ ngôn ngữ lập trình hướng đối tượng nào cho phép một lớp con hoặc lớp con cung cấp một triển khai cụ thể của một phương thức đã được cung cấp bởi một trong các lớp cha hoặc lớp cha của nó