Python學習筆記06-面向對象

類和對象

  • 類: 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
  • 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
  • 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
  • 實例變量:定義在方法中的變量,只作用于當前實例的類。
    對“類”和“對象”的使用:
      類就是一個模板,模板里可以包含多個函數,函數里實現一些功能。
      對象則是根據模板創建的實例,通過實例對象可以執行類中的函數。
class Person(): # 類
    height = 170 # 類變量
# 初始化函數,用來完成一些默認的設定
# 所謂的self,可以理解為自己
# 某個對象調用其方法時,python解釋器會把這個對象作為第一個參數傳遞給self,所以開發者只需要傳遞后面的參數即可
    def __init__(self, name, age):
        self.name = name # 實例變量
        self.__age = age # 私有屬性

# 方法
    def run(self):
        print("跑")

    def fight(self):
        print("打架")

p = Person('小麥', 18) #  創建對象 

私有屬性

  • Python中沒有像C++中public和private這些關鍵字來區別公有屬性和私有屬性
  • 它是以屬性命名方式來區分,如果在屬性名前面加了2個下劃線'__',則表明該屬性是私有屬性,否則為公有屬性(方法也是一樣,方法名前面加了2個下劃線的話表示該方法是私有的,否則為公有的)。

del()方法

  • 創建對象后,python解釋器默認調用init()方法;
  • 當刪除一個對象時,python解釋器也會默認調用一個方法,這個方法為del()方法
class Animal(object):

    # 初始化方法
    # 創建完對象后會自動被調用
    def __init__(self, name):
        print('__init__方法被調用')
        self.__name = name


    # 析構方法
    # 當對象被刪除時,會自動被調用
    def __del__(self):
        print("__del__方法被調用")
        print("%s對象馬上被干掉了..."%self.__name)

# 創建對象
dog = Animal("狗")

# 刪除對象
del dog

cat = Animal("貓")
cat2 = cat
cat3 = cat

print("---馬上 刪除cat對象")
del cat
print("---馬上 刪除cat2對象")
del cat2
print("---馬上 刪除cat3對象")
del cat3

輸出

__init__方法被調用
__del__方法被調用
狗對象馬上被干掉了...
__init__方法被調用
---馬上 刪除cat對象
---馬上 刪除cat2對象
---馬上 刪除cat3對象
__del__方法被調用
貓對象馬上被干掉了...

面向對象的三大特性

  • 封裝:對外部世界隱藏對象工作的細節。
  • 繼承:以普通類為基礎建立專門的類對象。
  • 多態:可以對不同類的對象使用相同的操作。
  1. 單繼承
    父類中的方法、屬性,子類會繼承。
# 定義一個父類,如下:
class Cat(object):

    def __init__(self, name, color="白色"):
        self.name = name
        self.color = color

    def run(self):
        print("%s--在跑"%self.name)


# 定義一個子類,繼承Cat類如下:
class Bosi(Cat):

    def setNewName(self, newName):
        self.name = newName

    def eat(self):
        print("%s--在吃"%self.name)


bs = Bosi("貓")
print('bs的名字為:%s'%bs.name)
print('bs的顏色為:%s'%bs.color)
bs.eat()
bs.setNewName('波斯貓')
bs.run()

運行結果

bs的名字為:貓
bs的顏色為:白色
貓--在吃
波斯貓--在跑
  1. 多繼承
class base(object):
    def test(self):
        print('----base test----')
class A(base):
    def test(self):
        print('----A test----')

# 定義一個父類
class B(base):
    def test(self):
        print('----B test----')

# 定義一個子類,繼承自A、B
class C(A,B):
    pass


obj_C = C()
obj_C.test()

print(C.__mro__) #可以查看C類的對象搜索方法時的先后順序

運行結果

----A test----
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.base'>, <type 'object'>)

3.多態
多態的概念是應用于Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。所謂多態:定義時的類型和運行時的類型不一樣,此時就成為多態。

class F1(object):
    def show(self):
        print('F1.show')

class S1(F1):
    def show(self):
        print('S1.show')

class S2(F1):
    def show(self):
        print('S2.show')

# 為了讓Func函數既可以執行S1對象的show方法,又可以執行S2對象的show方法,所以,定義了一個S1和S2類的父類
# 而實際傳入的參數是:S1對象和S2對象

def Func(F1 obj):
    """Func函數需要接收一個F1類型或者F1子類的類型"""

    print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函數中傳入S1類的對象 s1_obj,執行 S1 的show方法,結果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函數中傳入Ss類的對象 ss_obj,執行 Ss 的show方法,結果:S2.show
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容