#Python3面向物件繼承
阿新 • • 發佈:2018-12-17
Python3面向物件繼承
大家可以看出下面兩個類class Dog和class Sheep 他們有共同的屬性(weight height)和行為( def eating(self):雖然內容不一樣) 我們就將這些相同的屬性和行為抽出來,獨立為一個類。類就是從物件中抽出來的。
繼承的作用:
class Dog:
def __init__(self,name,weight,height,color):
self.name = name
self.weight = weight
self.height = height
self.color = color
def bark (self):
print("汪汪叫")
def eating(self):
print("吃飯")
class Sheep:
def __init__(self, weight, height):
self.weight = weight
self.height = height
def eating(self):
print("吃草")
抽出來並建立一個class Animal的類,但是問題又來了,那麼我們怎麼去呼叫共同屬性呢,這就要用到繼承了 也就是類名class Dog後面加括號並寫上繼承與那一個類class Dog(Animal):
class Animal:
def __init__(self, weight, height):
self.weight = weight
self.height = height
def eating(self):
print("吃草")
class Dog(Animal):
def __init__(self,name,weight,height,color):
super().__init__(weight,height) #當我們想要從父類中獲取父類的一部分屬性的時候,
self.name = name #就要用到 super ().__init__(父類的屬性)當然父類的屬性要在Dog類下面的init 引數裡面要有啊,
self.color = color #也可以用Animal.__init__(weight,height)進行獲取,即指定父類進行調取
#但是啊用Animal.__init__(weight,height)進行獲取會發現self這個用來接收物件名的引數無法傳入,所以還是super進行獲取
def bark(self):
print("汪汪叫")
def eating(self):
print("吃飯")
class Sheep(Animal):
pass
haer = Dog("二哈",20,30,"black") #例項化Dog類的物件haer 並錄入資料"二哈",20,30,"black"
haer.bark() #haer物件呼叫bark函式
#(輸出)汪汪叫
haer.eating() #haer物件呼叫eating函式
#(輸出)吃飯
litter = Sheep(10, 20) #同上啊
litter.eating() #呼叫eating但是會發現Sheep中根本沒有eating,
#(輸出)吃 #但是print 還是會輸出 “吃”,而這個吃即為Sheep的父類Animal中的行為屬性eating,
#也就是說Sheep這個類繼承了父類Animal的屬性程式碼
print(litter.weight) #當子類沒有的屬性,系統就會向上(父類)就行查詢,並且寫入屬性,有的話就不會向上查詢
#列如litter = Sheep(10, 20),並沒有__init__進行寫入屬性,就會向父類進行查詢並寫入Sheep類的物件litter屬性
#(輸出)10
即子類繼承父類的屬性程式碼,如果查詢子類時系統發現子類沒有這個屬性,它就會向上(它的父類去進行查詢)並運用到子類上。 super().init(引數) 獲取父類屬性 super().(父類的函式) 也可以獲取父類的函式
class Animal:
def __init__(self, weight, height):
self.weight = weight
self.height = height
def eating(self):
print("吃")
class Sheep(Animal):
def eating(self):
print("吃草")
super().eating() #本類有eating,但是還想對父類的eating進行一個呼叫,
#super().eating()進行呼叫父類的函式
litter = Sheep(20,10)
litter.eating()
#(輸出) 吃草
吃
oop
什麼是oop?即面向物件程式設計 面向物件三大特性,封裝,繼承,多型。 封裝:將方法封裝成一個函式,要用這個方法的時候,直接呼叫函式就可以了。隱藏內部實現,留出外部介面。將物件進行內部隱藏處理得到我們想要的想過,並傳出結果。最常見於框架 繼承:就是子類繼承父類的屬性和方法,但是有些私有的屬性不能繼承(比如__name 雙下劃線屬性),父類也有叫超類,子類也有叫派生類的。
Python:繼承為 多繼承
class X(object):
def f(self):
print ('x')
class A(X):
def f(self):
print ('a')
def extral(self):
print ('extral a')
class B(X):
def f(self):
print('b')
def extral(self):
print ('extral b')
class C(A, B, X):
def f(self):
super().f()
print('c')
print (C.mro())
#(輸出)[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.X'>, <class 'object'>]
#MRO表返回型別方法順序的解析表。
#print (C.mro()) -->class C(A, B, X):-->class A(X):-->class B(X):-->class X(object):
c = C()
c.f()
#(輸出) a #class C(A, B, X): def f(self):super().f() 到這裡,super().f()呼叫父類函式f(),預設查詢順序為A-->B-->X,
#如果A有就不會再繼續查詢下去,所以執行class A(X):輸出 a,
#然後在執行class C(A, B, X):下面的 print('c')語句
c
c.extral() #同理上面的查詢順序
#(輸出)extral a