1. 程式人生 > >【python】博客是必須寫的-3 面向對象

【python】博客是必須寫的-3 面向對象

默認 增加 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 面向對象