python中類與物件之繼承
阿新 • • 發佈:2018-12-14
1.什麼是繼承?
在程式中,繼承指的是class與class之間的關係
繼承是一種關係,必須存在兩個class才能產生這種關係;被繼承的class稱為父類,繼承的class稱為子類。
2.為什麼要使用繼承?
現實中,通過繼承,子可以直接使用父的內容。
在程式中,通過繼承,子類可以直接使用父類已有的程式碼
3.如何使用繼承
#繼承的定義 class Father1: x = 13 print('這是父類的x', x) def coding(self):print('我是父類的物件的繫結方法coding') @classmethod def missing(cls): print('這是父類的繫結方法missing') class Father2: y = 14 print('這是父類Father的y', y) class Son(Father1, Father2): pass print(Son.x) print(Son.y) son1 = Son() Son.coding(son1) Son.missing() son1.missing() ###輸出結果 13 14 我是父類的物件的繫結方法coding 這是父類的繫結方法missing#1.命名方式: 在子類中類名加上括號,加上父類的名稱即可 #2.在python中,一個子類可以有多個父類,多個父類在括號中用逗號隔開,這一點在其他語言中是不支援的。 #3.子類中的物件可以訪問父類的屬性和方法。 #4.子類可以呼叫父類的繫結方法
4.抽象
抽象:就是抽取公共的父類的方法
抽象的作用:抽取多個類中相同的方法和屬性形成一個新的類
#應用如下: class Person: def __init__(self, name, age): self.name = name self.age = agedef eating(self): print('%s要吃飯' % self.name) def sleeping(self): print('%s要睡覺' % self.name) class Child(Person): def crying(self, mom): print('%s今年%s歲會哭著找媽媽%s' % (self.name, self.age, mom.name)) class Adult(Person): def working(self, papa): print('%s會找老公%s' % (self.name, papa.name)) xiaoming = Child('xiaoming' , 2) mom = Adult('jessic', 28) papa = Adult('egon', 30) xiaoming.crying(mom) mom.working(papa) xiaoming.eating() xiaoming.sleeping() ###輸出結果 xiaoming今年2歲會哭著找媽媽jessic jessic會找老公egon xiaoming要吃飯 xiaoming要睡覺 #總結: 1.通過繼承,避免了重複程式碼的書寫 2.通過抽象,避免了繼承一些不該有的方法和屬性 3.寫繼承時應該先抽象再繼承 4.在抽取過程中,可能會有一些跟業務需求無關的類這是正常的,這些稱為公共父類。 5.公共父類的作用是儲存多個子類相同的屬性和方法
5.派生
派生指的是子類繼承父類,並且擁有自己獨特的屬性或技能,該子類稱為派生。派生類一定是子類。
#為什麼有派生類? #因為子類可能有自己獨特的屬性需要新增 class Person: def __init__(self, name, age): self.name = name self.age = age def say_hi(self): print("hello my name is %s,i'm %s years old" % (self.name, self.age)) class Student(Person): def __init__(self, name, age, adress): self.name = name self.age = age self.adress = adress def attend_class(self): print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() hello my name is daidai,i'm 26 years old daidai家在china,26歲,要好好學習 #Student就是一個派生類
6.子類訪問父類的方法和屬性
在派生中,相同的初始化屬性,相同部分寫了重複程式碼
有兩種方式可以讓子類訪問父類的方法和屬性
class Student(Person): def __init__(self, name, age, adress): #第一種呼叫方式:在子類中重用父類方法。這種呼叫方式與繼承關係無關 Person.__init__(self, name, age) self.adress = adress def attend_class(self): print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() ###2. class Student(Person): def __init__(self, name, age, adress): #第二種呼叫方式:利用super() #super()表示建立一個特殊物件,可用於呼叫父類 super().__init__(name,age) # Person.__init__(self, name, age) self.adress = adress def attend_class(self): print('%s家在%s,%s歲,要好好學習' % (self.name, self.adress, self.age)) daidai = Student('daidai', 26, 'china') daidai.say_hi() daidai.attend_class() ##瞭解 在python2中,super()的使用方法有所不同,需要寫成: super(Student, self).__init__(name, age) #其中Student表示父類,self表示是物件本身
7.繼承後子類的屬性查詢
class S: x = 1 class A(S): x = 2 class B(A): x = 3 b = B() b.x = 4 print(b.x) 子類物件和物件的查詢方法的查詢順序: 物件——>B(子類)——>A(父類)——>S(父類) #如果一個子類有多個父類時查詢順序 #1.如果父類不存在自己的父類時,按照繼承的順序去查詢BASC #2.如果父類還有自己的父類時,則按照繼承順序沿一條線找到底(深度查詢) #3.如果存在兩層關係還有公共關係時,會按照廣度優先原則查詢,也就是最後一層不會先找,先按照深度原則找完父類,然後再找父類的公共類 class C: x = 5 class S: x = 1 class A: x = 2 class B(A, S, C): x = 3 b = B() b.x = 4 print(b.x) #注意: 1.在經典類中,屬性的查詢只按照深度查詢原則 2.只有在python2中才有經典類
8.經典類和新式類
所有直接繼承或者間接繼承object的類,都是新式類,object稱之為根類,意思時所有類都是源自object類
-
為什麼這麼設計?
建立物件時,需要申請記憶體空間,建立新的名稱空間,將物件的屬性放入名稱空間,這一複雜的基礎操作都是由object完成的。簡單來說就是object提供了一些常用的基礎操作
注意:
1.在python3中,所有類都是object的子類,所有類都是新式類
2.在python2中,預設的是經典類,不會繼承object
#區別 #python3中定義類 class Cls(): print('python3中定義類') #python2中 class Cls(Object): print('python2中定義類')
-
class Cls(): print('python3中定義類') Cls.__base__ #Cls.__base__用於檢視父類 Cls.mor() .mor()顯示屬性列表