1. 程式人生 > >#Python3面向物件繼承

#Python3面向物件繼承

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