Trong trường hợp này, sẽ vô ích nếu bạn phải lặp lại chính mình và triển khai lại các phương thức từ lớp này sang lớp khác
Trong trường hợp này, bạn có thể sử dụng thừa kế
Một ví dụ tuyệt vời về thừa kế sẽ là mối quan hệ Người-Học sinh trong mã
- Giả sử mã của bạn có hai lớp, Người và Sinh viên
- Như các bạn đã biết, mỗi Học viên cũng là một Con người
- Do đó, thật hợp lý khi kế thừa tất cả các thuộc tính của Người cho Học sinh
Ví dụ
class Person: def __init__[self, name, age]: self.name = name self.age = age def introduce[self]: print[f"Hello, my name is {self.name}. I am {self.age} years old."] class Student[Person]: def __init__[self, name, age, graduation_year]: # DO not worry about the next line, we will come back to it very soon! super[].__init__[name, age] self.graduation_year = graduation_year def graduates[self]: print[f"{self.name} will graduate in {self.graduation_year}"]
Bây giờ bạn có thể sử dụng thiết lập này để tạo các đối tượng Sinh viên có thể sử dụng phương thức giới thiệu [] của lớp Person
Ví dụ
alice = Student["Alice", 30, 2023] alice.introduce[] alice.graduates[]
đầu ra
Hello, my name is Alice. I am 30 years old. Alice will graduate in 2023
Trong đoạn mã này
- alice. giới thiệu [] được gọi từ lớp cha của Sinh viên, nghĩa là Người
- alice. tốt nghiệp[] được gọi trực tiếp từ chính lớp Sinh viên
Điều này thể hiện rõ cách thức hoạt động của thừa kế
Mỗi học sinh là một con người. Thật hợp lý khi cung cấp trực tiếp các thuộc tính của một Người cho Sinh viên, thay vì triển khai lại chúng trong lớp Sinh viên
Bây giờ bạn đã hiểu kế thừa trong Python là gì
Tiếp theo, chúng ta hãy xem cách hoạt động của phương thức super[]
Siêu[] trong Python
Để truy cập các thuộc tính của lớp cha từ lớp con, bạn cần sử dụng phương thức super[]
super[] là một tham chiếu rõ ràng đến lớp cơ sở. Nó liên kết lớp cha của bạn với lớp con
Mọi thứ được tìm thấy trong lớp cha đều có thể được truy cập trong lớp con thông qua phương thức super[]
Ví dụ phổ biến nhất về việc sử dụng phương thức super[] là khi khởi tạo
Trong chương trước, bạn đã thấy một ví dụ về điều này
Bây giờ, hãy xem xét sâu hơn về cách thức hoạt động của nó
Siêu[]. __init__[] Gọi trong Python
Khi bạn khởi tạo một lớp con trong Python, bạn có thể gọi phương thức super[]. phương thức __init__[]. Điều này khởi tạo đối tượng lớp cha vào lớp con
Ngoài ra, bạn cũng có thể thêm thông tin dành riêng cho trẻ em vào đối tượng trẻ em
Đây là những gì nó thường trông giống như
class Parent: def init[v1, v2]: self.v1 = v1 self.v2 = v2 class Child[Parent]: def init[v1, v2, v3]: super[].__init__[v1, v2] self.v3 = v3
Đây
- Lớp Parent có các thuộc tính v1 và v2. Chúng được khởi tạo trong phương thức init[] của lớp cha
- Lớp Con kế thừa lớp Cha
- Lớp Con khởi tạo đối tượng Lớp Cha
- Lớp Con cũng tự khởi tạo bằng cách chỉ định một thuộc tính mới v3 chỉ thuộc về nó, không thuộc về Lớp Cha
Hãy cùng xem một ví dụ cụ thể hơn
Giả sử chúng ta có một lớp đại diện cho một người
Mỗi người có một tên và tuổi
Hơn nữa, mỗi đối tượng Person có khả năng tự giới thiệu bằng cách sử dụng phương thức giới thiệu[]
Đây là lớp Person trông như thế nào
class Person: def __init__[self, name, age]: self.name = name self.age = age def introduce[self]: print[f"Hello, my name is {self.name}. I am {self.age} years old."]
Lớp này hoạt động như một kế hoạch chi tiết để tạo các đối tượng Person trong mã của chúng tôi
Bây giờ, giả sử chúng tôi cũng muốn đại diện cho sinh viên trong chương trình của mình
Để làm điều này, chúng ta cần một lớp mới cho các đối tượng sinh viên
Cụ thể hơn, mỗi học sinh nên
- Có tên, tuổi và năm tốt nghiệp
- Biết giới thiệu bản thân
- Cho biết khi nào họ sẽ tốt nghiệp
Chúng ta có thể viết một lớp hoàn toàn riêng biệt như thế này
class Student[Person]: def __init__[self, name, age, graduation_year]: self.name = name self.age = age self.graduation_year = graduation_year def introduce[self]: print[f"Hello, my name is {self.name}. I am {self.age} years old."] def graduates[self]: print[f"{self.name} will graduate in {self.graduation_year}"]
Mặc dù điều này hoạt động, có một vấn đề
Mã này hiện đang lặp lại
Phương thức giới thiệu [] đã được triển khai trong lớp Người. Ngoài ra, phương thức init[] trông khá giống nhau
Chúng tôi có thể cải thiện mã bằng cách sử dụng tính kế thừa
Điều đầu tiên cần lưu ý là mỗi Học sinh cũng là một Người, điều này có ý nghĩa
Do đó, chúng ta có thể kế thừa trực tiếp các thuộc tính của Person cho lớp Student
Sau đó, hãy thêm một thành viên mới, tốt nghiệp_năm, vào đối tượng Sinh viên. Ngoài ra, chúng tôi cần một phương pháp để hiển thị này
Vì vậy, khi bắt đầu khởi tạo đối tượng Student, chúng ta có thể
- Khởi tạo đối tượng Person trong Student. Điều này xảy ra với siêu[]. cuộc gọi __init__[]. Điều này cung cấp tên và tuổi cho đối tượng Sinh viên
- Khởi tạo năm tốt nghiệp dành riêng cho sinh viên
Đây là phiên bản cải tiến của lớp Student sử dụng tính kế thừa
class Student[Person]: def __init__[self, name, age, graduation_year]: # 1. Initialize the Person object in Student. super[].__init__[name, age] # 2. Initialize the graduation_year self.graduation_year = graduation_year # Add a method that tells when this Student is going to graduate. def graduates[self]: print[f"{self.name} will graduate in {self.graduation_year}"]
Hãy chú ý đến super[]. cuộc gọi __init__[tên, tuổi]
Điều này gọi phương thức __init__[] của lớp cha, Person
Nói cách khác, nó khởi tạo một đối tượng Person thành đối tượng Student
Phương thức super[] trong Đa kế thừa
Bạn cũng có thể hợp lý hóa quá trình khởi tạo nhiều lớp với sự trợ giúp của phương thức super[]
Nói cách khác, bạn có thể sử dụng phương thức super[] trong nhiều lớp con để truy cập các thuộc tính chung của lớp cha
Chẳng hạn, hãy tạo một cấu trúc phân cấp sao cho đối tượng Person được kế thừa cho Student và Employee
Đây là giao diện của nó trong mã
class Person: def __init__[self, name, age]: self.name = name self.age = age def introduce[self]: print[f"Hello, my name is {self.name}. I am {self.age} years old."] # Subclass 1. class Student[Person]: def __init__[self, name, age, graduation_year]: super[].__init__[name, age] self.graduation_year = graduation_year def graduates[self]: print[f"{self.name} will graduate in {self.graduation_year}"] # Subclass 2. class Employee[Person]: def __init__[self, name, age, start_year]: super[].__init__[name, age] self.start_year = start_year def graduates[self]: print[f"{self.name} started working in {self.start_year}"]
Truy cập các phương thức kế thừa thông thường với Super[]
Trong một vài ví dụ trước, bạn đã thấy cách sử dụng phương thức super[] để gọi bộ khởi tạo của lớp cha
Điều quan trọng cần lưu ý là bạn cũng có thể truy cập bất kỳ phương thức nào khác
Ví dụ: hãy sửa đổi ví dụ Person-Student một chút. Hãy tạo một phương thức info[] cho lớp Sinh viên. Phương pháp này
- Gọi phương thức giới thiệu [] từ lớp cha để giới thiệu chính nó
- Hiển thị năm tốt nghiệp
Để gọi phương thức giới thiệu [] từ lớp cha, hãy sử dụng phương thức super [] để truy cập nó
Đây là giao diện của nó trong mã
Hello, I am a Pet0
đầu ra
Hello, my name is Alice. I am 30 years old. Alice will graduate in 2023
Như bạn có thể thấy, bây giờ có thể gọi phương thức info[] trên đối tượng Student để xem phần giới thiệu và bản in năm tốt nghiệp