標籤:中斷 c函數 print pen sel 寫法 python面向對 編程方式 總結
物件導向的三大特性: 封裝、繼承和多態
一、封裝
封裝,顧名思義就是將內容封裝到某個地方,以後可以直接調用被封裝到某處的內容。
- 將內容封裝到某處
- 從某處調用被封裝的內容
第一步,將內容封裝到某處:
class Foo: def __init__(self,name,age): self.name=name self.age=ageobj1=Foo(‘梅西‘,‘31‘)obj2=Foo(‘C羅‘,‘33‘)print(obj1.name,obj1.age)print(obj2.name,obj2.age)輸出結果:梅西 31C羅 33
View Code
self 是一個形式參數, 當執行 obj1=Foo(‘梅西‘,‘31‘),self 就等於obj1
當執行obj2=Foo(‘C羅‘,‘33‘),self就等於obj2
第二部,從某處調用被封裝的內容:
- 通過對象直接調用
- 同過self間接調用
1,通過對象直接調用被封裝的內容(格式:對象.屬性名稱)
class Foo: def __init__(self,name,age): self.name=name self.age=ageobj1=Foo(‘梅西‘,‘31‘)print(obj1.name) #直接調用obj1的name屬性print(obj1.age) #直接調用obj1的age屬性obj2=Foo(‘C羅‘,‘33‘)print(obj2.name) #直接調用obj2的name屬性print(obj2.age) #直接調用obj2的age屬性
View Code
2,執行類中的方法時,通過 self 間接調用被封裝的內容:
class Foo: def __init__(self,name,age): self.name=name self.age=age def detail(self): print(self.name,self.age)obj1=Foo(‘梅西‘,‘31‘)obj1.detail()obj2=Foo(‘C羅‘,‘33‘)obj2.detail()>>>梅西 31C羅 33
View Code
綜上所述,對於物件導向的封裝來說,其實就是使用構造方法將內容封裝到對象中,然後通過對象直接或self間接擷取被封裝的內容。
練習一:在終端輸出如下資訊
- 小明,10歲,男,上山去砍柴
- 小明,10歲,男,開車去東北
- 小明,10歲,男,最愛大保健
- 老李,90歲,男,上山去砍柴
- 老李,90歲,男,開車去東北
- 老李,90歲,男,最愛大保健
- 老張...
函數式物件導向
上述對比可以看出,如果使用函數式編程,需要在每次執行函數時傳入相同的參數,如果參數多的話......
物件導向只需要在建立對象時,將所需要的參數封裝到對象中,之後使用時,通過self間接去對象中取值即可。
二、繼承
物件導向中的繼承和我們現實生活中的繼承相同:即,子可以繼承父的內容。
例如:
貓可以:喵喵叫,吃,喝,拉,撒
狗可以:汪汪叫,吃,喝,拉,撒
如果我們要分別為貓和狗建立一個類,那麼就需要為貓和狗實現他們所有的功能,例如:
class 貓: def 喵喵叫(self): print ‘喵喵叫‘ def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do somethingclass 狗: def 汪汪叫(self): print ‘喵喵叫‘ def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something
View Code
上述代碼可以看出,吃喝拉撒是貓和狗都具有的功能,而我們卻分別為貓和狗的類中編寫了兩次,如果使用繼承的思想,如下實現:
動物:吃、喝、拉、撒
貓:喵喵叫、(貓繼承動物的功能)
狗:汪汪叫、(狗繼承動物的功能)
class Animal: def eat(self): print "%s 吃 " %self.name def drink(self): print "%s 喝 " %self.name def shit(self): print "%s 拉 " %self.name def pee(self): print "%s 撒 " %self.nameclass Cat(Animal): def __init__(self, name): self.name = name self.breed = ‘貓‘ def cry(self): print ‘喵喵叫‘class Dog(Animal): def __init__(self, name): self.name = name self.breed = ‘狗‘ def cry(self): print ‘汪汪叫‘ # ######### 執行 #########c1 = Cat(‘小白家的小黑貓‘)c1.eat()c2 = Cat(‘小黑的小白貓‘)c2.drink()d1 = Dog(‘胖子家的小瘦狗‘)d1.eat()
View Code
所以對於物件導向的繼承來說,其實就是將多個類中共有的方法提取到父類中,子類繼承父類,而不必一一實現每個方法。
註:除了子類和父類的稱謂,也可以叫他們衍生類別和基類。
-- 多繼承
1、Python的類可以繼承多個類,Java和C#中則只能繼承一個類
2、Python的類如果繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先和廣度優先
繼承順序
注意:在上述尋找過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
三、多態
Pyhon不支援Java和C#這一類強型別語言中多態的寫法,但是原生多態,其Python崇尚“鴨子類型”。
class F1: passclass S1(F1): def show(self): print(‘S1.show‘)class S2(F1): def show(self): print(‘S2.show‘)# 由於在Java或C#中定義函數參數時,必須指定參數的類型# 為了讓Func函數既可以執行S1對象的show方法,又可以執行S2對象的show方法,所以,定義了一個S1和S2類的父類# 而實際傳入的參數是:S1對象和S2對象def Func(arg): """Func函數需要接收一個F1類型或者F1子類的類型""" arg.show()s1_obj = S1()Func(s1_obj) # 在Func函數中傳入S1類的對象 s1_obj,執行 S1 的show方法,結果:S1.shows2_obj = S2()Func(s2_obj) # 在Func函數中傳入Ss類的對象 ss_obj,執行 Ss 的show方法,結果:S2.show
View Code
以上就是本節對於物件導向初級知識的介紹,總結如下:
- 物件導向是一種編程方式,此編程方式的實現是基於對 類 和 對象 的使用
- 類 是一個模板,模板中封裝了多個“函數”供使用
- 對象,根據模板建立的執行個體(即:對象),執行個體用於調用被封裝在類中的函數
- 物件導向三大特性:封裝、繼承和多態
python物件導向三大特性