Python學習手冊之類和繼承

  • 2020 年 1 月 20 日
  • 筆記

在上一篇文章中,我們介紹了 Python 的函數式編程,現在我們介紹 Python 的類和繼承。

查看上一篇文章請點擊:https://www.cnblogs.com/dustman/p/10010690.html

類 先前,我們研究過兩種編程範式--命令式(使用語句、循環和函數)和函數(使用純函數、高階函數和遞歸)。 接下來我們學習一個編程方式是面向對象編程 —— Object Oriented Programming,簡稱 OOP,這是一種程式設計思想。OOP 把對象作為程式的基本單元,類描述對象將是什麼,一個對象包含了數據和操作數據的函數。 面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函數的順序執行為了簡化程式設計,面向過程把函數繼續切分為子函數,即把大塊函數通過切割成小塊函數來降低系統的複雜度。 而面向對象的程式設計把電腦程式視為一組對象的集合,而每個對象都可以接收其他對象發過來的消息並處理這些消息。電腦程式的執行就是一系列消息在各個對象之間傳遞。 類是使用關鍵字 class 和縮進塊創建的,縮進塊包含類方法(這些是函數)。

class Dog:   def __init__(self,name): #__init__傳參數    self.name = name    d1 = Dog("張三")  d2 = Dog("李四")  d3 = Dog("王五")
數據封裝、繼承和多態是面向對象的三大特點。

__init__方法 __init__方法是類中比較重要的方法,它在創建類的實例(對象)時調用,這種方法創建的屬性我們稱為實例變數。 類中所有方法都必須將 self 作為它們的第一個參數,儘管它沒有顯式傳遞,但是 Python 將 self 參數添加到列表中。在調用方法時不需要包含它。在方法定義中,self 引用調用該方法的實例。類的實例具有屬性,這些屬性是與實例關聯的數據。 在本例中,Dog 實例將具有 name 和 eyes 的屬性。可以通過實例後面加點和屬性名來訪問這些值。同樣,在 __init__ 方法中,可以使用 self.attribute 來設置實例屬性的初始值。

class Dog:   def __init__(self,name,eyes): #__init__傳參數    self.name = name    self.eyes = eyes    d1 = Dog("張三",2)  d2 = Dog("李四",2)  d3 = Dog("王五",2)  print(d1.name)  print(d2.name)  print(d3.name)
特殊方法 __init__ 前後分別有兩個下劃線!  在上面的實例中,__init__ 方法接受兩個參數,並將它們分配給對象的屬性。__init__ 方法稱為類構造函數。

方法 類可以定義其他方法用來添加一些功能。請記住,所有方法都必須將 self 作為它們的第一個參數。使用點加屬性的語法來訪問這些方法。

class Dog:   def __init__(self,name,eyes): #__init__傳參數    self.name = name    self.eyes = eyes     def bulk(self):    print("%s:wang wang wang!" %self.name)    d1 = Dog("張三",2)  d2 = Dog("李四",2)  d3 = Dog("王五",2)    d1.bulk()  d2.bulk()  d3.bulk()

運行結果:

>>>  張三:wang wang wang!  李四:wang wang wang!  王五:wang wang wang!  >>>

類屬性一種是通過 __init__ 方法來定義,也可以自己直接定義類屬性,這種屬性我們叫它類變數。它是通過在類的主體內分配變數創建的。可以從類的實例或類本身訪問它們。

class Dog:   def __init__(self,name,eyes): #__init__傳參數    self.name = name    self.eyes = eyes    d1 = Dog("張三",2)  d2 = Dog("李四",2)  d3 = Dog("王五",2)    print(d1.name)  print(d2.name,d2.eyes)  print(d3.eyes)

運行結果:

>>>  張三  李四 2  2  >>>
類變數由類的所有實例共享。

嘗試訪問一個實例中未定義的屬性或方法會導致 AttributeError 異常。

class Student:   def __init__(self,id,name):    self.id = id    self.name = name    man = Student(10086,"China")  print(man.id)  print(man.sex)

運行結果:

>>>  10086  AttributeError: 'Student' object has no attribute 'sex'  >>>

繼承 通過在兩個類中共享函數實現繼承。 想像以下有些類,比如 Cat, Dog, Rabbit。儘管它們有一些不同,但是它們都有顏色,名字屬性。 這些相同點可以通過繼承父類 Animal 來實現這些共享的屬性方法。繼承最大的好處是子類獲得了父類的全部功能。

class Animal:   def __init__(self,name,sex):    self.name = name    self.sex = sex    class Cat(Animal):   def talk(self):    print('Neow!')    func = Cat("ZS","F")  print(func.name)  func.talk()

運行結果:

>>>  ZS  Neow!  >>>

在 OOP 程式設計中,當我們定義了一個 class 的時候,可以從某個現有的 class 繼承,新的 class 稱為子類 (Subclass) , 而被繼承的 class 稱為基類、父類或超類 (Base class、Super class)。 如果一個子類擁有一個和父類相同的屬性和方法,我們稱為重寫 (override)。在程式碼運行的時候,總是會調用子類的方法。

class Animal:   def __init__(self,name,sex):    self.name = name    self.sex = sex     def take(self):    print("Hello...")    class Cat(Animal):   def talk(self):    print('Neow!')    func = Cat("ZS","F")  print(func.name)  func.talk()

運行結果:

>>>  ZS  Neow!  >>>
上面例子中 Animal 是父類,Cat 是子類。

子類同樣可以做為父類被繼承,這樣繼承的子類擁有兩個父類的方法和屬性。

class A:   def func_A(self):    print("A 類")    class B(A):   def func_B(self):    print("B 類")    class C(B):   def func_C(self):    print("C 類")    obj = C()  obj.func_A()  obj.func_B()  obj.func_C()

運行結果:

>>>  A 類  B 類  C 類  >>>
注意:盡量不要循環繼承。

方法 super 用來在子類中代指父類,可以用於在實例的父類中找到具有特定名稱的方法。

class Animal:   def msg(self):    print("It's a dog!")    class Cat(Animal):   def talk(self):    print('Neow!')    super().msg()    Cat().msg()

運行結果:

>>>  It's a dog!  >>>
Cat().msg() 調用父類的 msg 方法。

「你們紀念的只是過去,如果拉上你的各種同學到你面前,你們還是無話可說。」

Tags: