Kế thừa Python (Với các ví dụ)

Tính kế thừa cho phép chúng ta xác định một lớp có tất cả các chức năng từ lớp cha và cho phép chúng ta thêm nhiều hơn nữa. Trong hướng dẫn này, bạn sẽ học cách sử dụng kế thừa trong Python.

Video: Kế thừa Python

Kế thừa trong Python

Kế thừa là một tính năng mạnh mẽ trong lập trình hướng đối tượng.

Nó đề cập đến việc xác định một lớp mới với ít hoặc không có sửa đổi đối với một lớp hiện có. Lớp mới được gọi là lớp dẫn xuất (hoặc con)lớp mà nó kế thừa được gọi là lớp cơ sở (hoặc cha) .

Cú pháp kế thừa Python

 lớp BaseClass: Phần thân của lớp cơ sở Lớp gốc (BaseClass): Phần thân của lớp dẫn xuất

Lớp có nguồn gốc kế thừa các tính năng từ lớp cơ sở nơi các tính năng mới có thể được thêm vào nó. Điều này dẫn đến khả năng tái sử dụng của mã.

Ví dụ về Thừa kế trong Python

Để chứng minh việc sử dụng kế thừa, chúng ta hãy lấy một ví dụ.

Đa giác là một hình khép kín có 3 cạnh trở lên. Giả sử, chúng ta có một lớp được Polygonđịnh nghĩa như sau.

 class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = (0 for i in range(no_of_sides)) def inputSides(self): self.sides = (float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

Lớp này có các thuộc tính dữ liệu để lưu trữ số cạnh n và độ lớn của mỗi cạnh dưới dạng danh sách được gọi là các cạnh.

Các inputSides()phương pháp mất trong tầm quan trọng của mỗi bên và dispSides()hiển thị các độ dài phụ.

Hình tam giác là hình đa giác có 3 cạnh. Vì vậy, chúng ta có thể tạo một lớp có tên là Triangle kế thừa từ Polygon. Điều này làm cho tất cả các thuộc tính của lớp Polygon có sẵn cho lớp Triangle.

Chúng ta không cần xác định lại chúng (khả năng tái sử dụng mã). Hình tam giác có thể được định nghĩa như sau.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

Tuy nhiên, lớp Trianglecó một phương thức mới findArea()để tìm và in diện tích của tam giác. Đây là một cuộc chạy mẫu.

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Chúng ta có thể thấy rằng mặc dù chúng ta không định nghĩa các phương thức như inputSides()hoặc dispSides()cho lớp Triangleriêng biệt, chúng ta vẫn có thể sử dụng chúng.

Nếu một thuộc tính không được tìm thấy trong chính lớp đó, thì việc tìm kiếm sẽ tiếp tục đến lớp cơ sở. Điều này lặp lại một cách đệ quy, nếu lớp cơ sở chính nó được dẫn xuất từ ​​các lớp khác.

Ghi đè phương pháp trong Python

Trong ví dụ trên, lưu ý rằng __init__()phương thức được định nghĩa trong cả hai lớp, Triangle và Polygon. Khi điều này xảy ra, phương thức trong lớp dẫn xuất sẽ ghi đè phương thức đó trong lớp cơ sở. Điều này có nghĩa là, __init__()trong Tam giác được ưu tiên hơn __init__trong Đa giác.

Nói chung khi ghi đè một phương thức cơ sở, chúng ta có xu hướng mở rộng định nghĩa hơn là chỉ thay thế nó. Điều tương tự cũng được thực hiện bằng cách gọi phương thức trong lớp cơ sở từ phương thức trong lớp dẫn xuất (gọi Polygon.__init__()từ __init__()trong Triangle).

Một lựa chọn tốt hơn sẽ là sử dụng chức năng tích hợp sẵn super(). Vì vậy, super().__init__(3)tương đương với Polygon.__init__(self,3)và được ưu tiên. Để tìm hiểu thêm về super()hàm trong Python, hãy truy cập hàm super () trong Python.

Hai hàm tích hợp sẵn isinstance()issubclass()được sử dụng để kiểm tra số thừa kế.

Hàm isinstance()trả về Truenếu đối tượng là một thể hiện của lớp hoặc các lớp khác dẫn xuất từ ​​nó. Mỗi và mọi lớp trong Python đều kế thừa từ lớp cơ sở object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Tương tự, issubclass()được sử dụng để kiểm tra tính kế thừa của lớp.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

thú vị bài viết...