【python】博客是必須寫的-3 面向對象
阿新 • • 發佈:2018-01-05
默認 增加 5.2.1 找到 廣度優先 gin apr tool 類和對象 1.基本概念
·面向對象是一種編程方式,此編程方式是基於"類"和"對象"的使用 ·類:是一個模板,模板中包裝了多個"函數"供使用(可以將多個函數共用的變量封裝到對象中) ·對象:根據類創建的實例,實例用於調用包裝在類中的函數 ·面向對象的三大特性:封裝、繼承、多態
2.創建類和對象
·面向對象:[創建對象][通過對象調用函數,即執行方法]
·函數編程:[執行函數]
這個並不能說明函數編程就比面向對象簡便:
函數編程應用場景:各個函數之間是獨立的,且無共用的數據
3.類和對象在內存中如何保存
類和類中的方法在內存中只有一份,但是每個對象都在內存中存一份
如上所示:在創建對象時,除了封裝name和age屬性外,還會保存一個類對象指針:
當對象執行類中的方法時:
1>根據類對象指針找到類中的方法
2>將對象當做參數傳給方法的self參數
4.封裝:對於面向對象的封裝來說,其實就是使用構造方法將內容封裝到 對象 中,然後通過對象直接或者self間接獲取被封裝的內容
4.1)將內容封裝到self中
self是一個形式參數,當執行obj1 = Foo('wupeiqi',18)時,self等於obj1;所以,內容其實就是被封裝到了對象obj1和obj2中(方便在類中的函數中調用),每個對象中都有name、age屬性
4.2)調用被封裝的內容
4.2.1)通過對象直接調用
class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo('wupeiqi', 18) print obj1.name # 直接調用obj1對象的name屬性 print obj1.age # 直接調用obj1對象的age屬性 obj2 = Foo('alex', 73) print obj2.name # 直接調用obj2對象的name屬性 print obj2.age # 直接調用obj2對象的age屬性
4.2.2)通過self間接調用
class Foo: def __init__(self, name, age): self.name = name self.age = age def detail(self): print self.name print self.age obj1 = Foo('wupeiqi', 18) obj1.detail() # Python默認會將obj1傳給self參數,即:obj1.detail(obj1),所以,此時方法內部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18 obj2 = Foo('alex', 73) obj2.detail() # Python默認會將obj2傳給self參數,即:obj1.detail(obj2),所以,此時方法內部的 self = obj2,即:self.name 是 alex ; self.age 是 78
5.繼承:對於面向對象的繼承來說,其實就是將多個類共有的方法提取到父類中,子類僅需繼承父類而不必一一實現每個方法
5.1)單繼承
5.2)多繼承
5.2.1)經典類繼承:深度優先-A-B-D-C
class D: def bar(self): print 'D.bar' class C(D): def bar(self): print 'C.bar' class B(D): def bar(self): print 'B.bar' class A(B, C): def bar(self): print 'A.bar' a = A()
5.2.2)新式類繼承:父類繼承object類:D(object)
廣度優先:A-B-C-D
6.多態
6.1)子類重寫父類方法
當子類和父類都存在相同的方法時,可以在子類中重寫父類的方法,當然也可以選擇不重寫父類的方法,直接繼承,這就是多態 "開閉原則" ·對擴展開放:允許子類重寫父類方法函數 ·對修改封閉:不重寫,直接繼承父類方法函數
class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex def print_title(self): if self.sex == "male": print("man") elif self.sex == "female": print("woman") class Child(Person): # Child 繼承 Person def print_title(self): if self.sex == "male": print("boy") elif self.sex == "female": print("girl") May = Child("May","female") Peter = Person("Peter","male") print(May.name,May.sex,Peter.name,Peter.sex) May.print_title() Peter.print_title()
6.2)子類重寫構造函數
子類可以沒有構造函數,表示同父類構造函數一致,但是要增加屬性時,可以重寫構造函數
class Person(object): def __init__(self,name,sex): self.name = name self.sex = sex class Child(Person): # Child 繼承 Person def __init__(self,name,sex,mother,father): Person.__init__(self,name,sex) # 子類對父類的構造方法的調用 self.mother = mother self.father = father May = Child("May","female","April","June") print(May.name,May.sex,May.mother,May.father)
【python】博客是必須寫的-3 面向對象