一、繼承
1、什么是繼承
繼承是一種新建類的方式,新建的類稱之為子類火派生類,繼承的父類稱之為基類或超類,
1)在python中,一個子類可以繼承多個父類
2)在其他語言中,一個子類只能繼承一個父類
2、繼承的作用
減少代碼的冗余
3、如何實作類的繼承
1)先確認誰是子類,誰是父類
2)在定義子類時 子類名(父類名)
# 父類1 class Father1: x = 1 # 父類2 class Father2: y = 2 # 父類3 class Father3: z = 3 # 子類 class Sub(Father1, Father2, Father3): pass # 查看父類:子類.__bases__ print(Sub.__bases__) # 繼承父類的屬性 print(Sub.x, Sub.y, Sub.z)
執行結果:
(<class '__main__.Father1'>, <class '__main__.Father2'>, <class '__main__.Father3'>) 1 2 3
4、尋找繼承關系
1)確認誰是子類
2)確認誰是父類
- 得先抽象,再繼承
- 抽取物件之間相似的部分,總結出類
- 抽取類之間相似的部分,總結出父類
# 例,寫一個老師類和學生類:
# 老師類 class JldTeacher: school = "Jld" country = "China" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 老師修改分數 def chang_score(self): print(f"{self.name}老師正在修改分數,,,") # 學生類 class JldStudent: school = "Jld" country = "China" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 學生選擇課程 def chose_course(self): print(f"{self.name}學生正在選擇課程,,,")
注意:老師類和學生類有相似的部分,造成代碼冗余
# 解決代碼冗余問題:使用繼承
# 學校類[是家里蹲(Jld)學校老師(JldTeacher)和學生(JldStudent)的父類)] class Jld: school = "Jld" country = "China" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 老師類[是家里蹲學校(Jld)的子類] class JldTeacher(Jld): # 老師修改分數 def chang_score(self): print(f"{self.name}老師正在修改分數,,,") # 學生類[是家里蹲學校(Jld)的子類] class JldStudent(Jld): # 學生選擇課程 def chose_course(self): print(f"{self.name}學生正在選擇課程,,,") student_obj = JldStudent("張三兒", 85, "female") # 查看student_obj的名稱空間 print(student_obj.__dict__)
print(student_obj.name, student_obj.age, student_obj.sex)
teacher_obj = JldStudent("王五", 101, "male") # 查看teacher_obj的名稱空間 print(teacher_obj.__dict__)
print(teacher_obj.name, teacher_obj.age, teacher_obj.sex)
執行結果:
{'name': '張三兒', 'age': 85, 'sex': 'female'}
張三兒 85 female
{'name': '王五', 'age': 101, 'sex': 'male'}
王麻子 101 male
5、在繼承背景下物件查找屬性的順序
在繼承背景下物件查找屬性的順序:
1)先從物件自己的名稱空間找
2)物件中沒有,從子類的名稱空間找
3)子類中沒有,從父類的名稱空間找,若父類沒有,則會報錯
注意:程式的執行順序是由下到上,父類必須定義在子類的上方
# 父類 class Goo: x = 10 # 子類 class Foo(Goo): # x = 100 pass foo_obj = Foo() # foo_obj.x = 1000 print(foo_obj.x)
執行結果:
10
二、派生
1、什么是派生
派生:
指的是子類繼承父類的屬性和方法,并且派生出自己獨有的屬性與方法,
若子類中的方法名與父類中的方法名相同(重寫),就先用子類的
# 父類 class Foo(): def f1(self): print("from Foo.f1..") def f2(self): print("from Foo.f2..") self.f1() # 子類 class Goo(Foo): # 子類中存在有與父類一樣的方法叫做重寫 def f1(self): print("from Goo.f1..") def func(self): print("from Goo.func..") goo_obj = Goo() print(goo_obj.f1()) # from Goo.f1.. print(goo_obj.func()) # from Goo.func.. # 派生后繼承物件驗證: print(goo_obj.f2()) # from Foo.f2.. from Goo.f1..
執行結果:
from Goo.f1.. from Goo.func.. from Foo.f2.. from Goo.f1..
2、子類派生
子類派生:子類繼承父類,重用父類的屬性與方法,并且派生出自己的屬性與方法,
有兩種方式:
1)直接參考父類的__init__為其傳參,并添加子類的屬性
2)通過super來指向父類的屬性
super是一個特殊的類,呼叫super得到一個物件,該物件指向父類的名稱空間
注意:使用哪一種都可以,但不能兩種混合使用
# 寫一個老師類和學生類
# 需求:為老師添加薪資屬性,為學生添加年級屬性
# 第一種方式:直接參考父類的__init__為其傳參,并添加子類的屬性
# 第一種方式:直接參考父類的__init__為其傳參,并添加子類的屬性 class Jld: school = "Jld" # country = "China" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class JldTeacher(Jld): def __init__(self, name, age, sex, sal): # 參考父類Jld的屬性 Jld.__init__(self, name, age, sex) # 派生(添加)出子類JldTeacher自己的屬性 self.sal = sal # 老師修改分數 def chang_score(self): print(f"{self.name}老師正在修改分數,,,") class JldStudent(Jld): def __init__(self, name, age, sex, grade): # 參考父類Jld的屬性 Jld.__init__(self, name, age, sex) # 派生(添加)出子類JldStudent自己的屬性 self.grade = grade # 學生選擇課程 def chose_course(self): print(f"{self.name}學生正在選擇課程,,,") teacher_obj = JldTeacher("王五", 89, "female", 1000000) student_obj = JldStudent("張三兒", 87, "male", "大二") print(teacher_obj.name, teacher_obj.sex, teacher_obj.age, teacher_obj.sal) print(student_obj.name, student_obj.sex, student_obj.age, student_obj.grade)
執行結果:
王五 female 89 1000000
張三兒 male 87 大二
# 第二種方式:通過super來指向父類的屬性
# 第二種方式:通過super來指向父類的屬性 class Jld: school = "Jld" # country = "China" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class JldTeacher(Jld): def __init__(self, name, age, sex, sal): # super() --> 特殊的物件 --> 物件.屬性 --> 父類的名稱空間 # 會將外部呼叫的類當做第一個引數自動傳給__init__ super().__init__(name, age, sex) # 派生(添加)出子類JldTeacher自己的屬性 self.sal = sal # 老師修改分數 def chang_score(self): print(f"{self.name}老師正在修改分數,,,") class JldStudent(Jld): def __init__(self, name, age, sex, grade): # 會將外部呼叫的類當做第一個引數自動傳給__init__ super().__init__(name, age, sex) # 派生(添加)出子類JldStudent自己的屬性 self.grade = grade # 學生選擇課程 def chose_course(self): print(f"{self.name}學生正在選擇課程,,,") teacher_obj = JldTeacher("王五", 89, "female", 1000000) student_obj = JldStudent("張三兒", 87, "male", "大二") print(teacher_obj.name, teacher_obj.sex, teacher_obj.age, teacher_obj.sal) print(student_obj.name, student_obj.sex, student_obj.age, student_obj.grade)
執行結果:
王五 female 89 1000000
張三兒 male 87 大二
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189497.html
標籤:Python
