มรดกหลาม
มรดกหลาม
การสืบทอดช่วยให้เราสามารถกำหนดคลาสที่สืบทอดวิธีการและคุณสมบัติทั้งหมดจากคลาสอื่น
คลาสหลักคือคลาสที่สืบทอดมาจากคลาสหรือที่เรียกว่าคลาสฐาน
คลาสลูกคือคลาสที่สืบทอดมาจากคลาสอื่น เรียกอีกอย่างว่าคลาสที่ได้รับ
สร้างชั้นเรียนผู้ปกครอง
คลาสใดก็ได้สามารถเป็นคลาสหลักได้ ดังนั้นไวยากรณ์จึงเหมือนกับการสร้างคลาสอื่นๆ:
ตัวอย่าง
สร้างคลาสชื่อPerson
, with
firstname
และlastname
properties และprintname
method:
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname,
self.lastname)
#Use the Person class to create an object, and then
execute the printname method:
x = Person("John", "Doe")
x.printname()
สร้างชั้นเรียนเด็ก
ในการสร้างคลาสที่สืบทอดฟังก์ชันการทำงานจากคลาสอื่น ให้ส่งคลาสพาเรนต์เป็นพารามิเตอร์เมื่อสร้างคลาสย่อย:
ตัวอย่าง
สร้างคลาสชื่อStudent
ซึ่งจะสืบทอดคุณสมบัติและเมธอดจากPerson
คลาส:
class Student(Person):
pass
หมายเหตุ:ใช้pass
คำสำคัญเมื่อคุณไม่ต้องการเพิ่มคุณสมบัติหรือวิธีการอื่นใดในชั้นเรียน
ตอนนี้คลาส Student มีคุณสมบัติและเมธอดเดียวกันกับคลาส Person
ตัวอย่าง
ใช้Student
คลาสเพื่อสร้างอ็อบเจ็กต์ แล้วรันprintname
เมธอด:
x = Student("Mike", "Olsen")
x.printname()
เพิ่มฟังก์ชัน __init__()
จนถึงตอนนี้ เราได้สร้างคลาสลูกที่สืบทอดคุณสมบัติและเมธอดจากพาเรนต์
เราต้องการเพิ่ม__init__()
ฟังก์ชันให้กับคลาสย่อย (แทนที่จะเป็นpass
คีย์เวิร์ด)
หมายเหตุ:ฟังก์ชัน__init__()
นี้จะถูกเรียกโดยอัตโนมัติทุกครั้งที่มีการใช้คลาสเพื่อสร้างอ็อบเจกต์ใหม่
ตัวอย่าง
เพิ่ม__init__()
ฟังก์ชั่นให้กับ
Student
คลาส:
class Student(Person):
def __init__(self, fname, lname):
#add properties etc.
เมื่อคุณเพิ่ม__init__()
ฟังก์ชัน คลาสย่อยจะไม่สืบทอด__init__()
ฟังก์ชัน ของพาเรนต์อีกต่อไป
หมายเหตุ:__init__()
ฟังก์ชันย่อยจะแทนที่การสืบทอด
__init__()
ฟังก์ชันของพาเรนต์
หากต้องการคงการสืบทอด__init__()
ฟังก์ชันของพาเรนต์ ให้เพิ่มการเรียกไปยัง__init__()
ฟังก์ชันของพาเรนต์:
ตัวอย่าง
class Student(Person):
def __init__(self, fname, lname):
Person.__init__(self, fname, lname)
ตอนนี้เราได้เพิ่มฟังก์ชัน __init__() สำเร็จแล้ว และเก็บการสืบทอดของคลาสพาเรนต์ไว้ และเราพร้อมที่จะเพิ่มฟังก์ชันการทำงานใน
__init__()
ฟังก์ชัน
ใช้ super() ฟังก์ชั่น
Python ยังมีsuper()
ฟังก์ชั่นที่จะทำให้คลาสย่อยสืบทอดวิธีการและคุณสมบัติทั้งหมดจากพาเรนต์:
ตัวอย่าง
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
โดยการใช้super()
ฟังก์ชัน คุณไม่จำเป็นต้องใช้ชื่อขององค์ประกอบหลัก มันจะสืบทอดวิธีการและคุณสมบัติจากผู้ปกครองโดยอัตโนมัติ
เพิ่มคุณสมบัติ
ตัวอย่าง
เพิ่มคุณสมบัติที่เรียกว่าgraduationyear
คลาส
Student
:
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
self.graduationyear
= 2019
ในตัวอย่างด้านล่าง ปี2019
ควรเป็นตัวแปร และส่งต่อไปยัง
Student
ชั้นเรียนเมื่อสร้างวัตถุของนักเรียน ในการดำเนินการดังกล่าว ให้เพิ่มพารามิเตอร์อื่นในฟังก์ชัน __init__():
ตัวอย่าง
เพิ่มyear
พารามิเตอร์ และส่งปีที่ถูกต้องเมื่อสร้างวัตถุ:
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear
= year
x = Student("Mike", "Olsen", 2019)
เพิ่มวิธีการ
ตัวอย่าง
เพิ่มวิธีการที่เรียกว่าwelcome
คลาส
Student
:
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear
= year
def welcome(self):
print("Welcome",
self.firstname, self.lastname, "to the class of", self.graduationyear)
หากคุณเพิ่มเมธอดในคลาสย่อยที่มีชื่อเดียวกับฟังก์ชันในคลาสพาเรนต์ การสืบทอดของเมธอดพาเรนต์จะถูกแทนที่