面向物件Python - 入門



程式語言不斷湧現,不同的程式設計方法也是如此。面向物件程式設計就是這樣一種在過去幾年中變得非常流行的程式設計方法。

本章討論Python程式語言的特性,這些特性使其成為一種面向物件程式語言。

語言程式設計分類方案

Python可以歸類為面向物件程式設計方法。下圖顯示了各種程式語言的特性。觀察使Python面向物件的特性。

語言類別 類別 語言
程式設計正規化 過程式 C, C++, C#, Objective-C, Java, Go
指令碼式 CoffeeScript, JavaScript, Python, Perl, PHP, Ruby
函式式 Clojure, Erlang, Haskell, Scala
編譯類別 靜態 C, C++, C#, Objective-C, Java, Go, Haskell, Scala
動態 CoffeeScript, JavaScript, Python, Perl, PHP, Ruby, Clojure, Erlang
型別類別 強型別 C#, Java, Go, Python, Ruby, Clojure, Erlang, Haskell, Scala
弱型別 C, C++, C#, Objective-C, CoffeeScript, JavaScript, Perl, PHP
記憶體類別 託管 其他
非託管 C, C++, C#, Objective-C

什麼是面向物件程式設計?

面向物件意味著面向物件。換句話說,這意味著功能上傾向於對物件建模。這是透過描述透過其資料和行為進行互動的物件集合來對複雜系統建模的眾多技術之一。

Python,一種面向物件程式設計 (OOP) 語言,是一種程式設計方式,它專注於使用物件和類來設計和構建應用程式。面向物件程式設計 (OOP) 的主要支柱是繼承、多型、抽象封裝

面向物件分析 (OOA) 是檢查問題、系統或任務並識別物件及其之間互動的過程。

為什麼要選擇面向物件程式設計?

Python的設計採用了面向物件的方法。OOP 提供以下優勢:

  • 提供清晰的程式結構,使對映現實世界問題及其解決方案變得容易。

  • 方便維護和修改現有程式碼。

  • 增強程式模組化,因為每個物件獨立存在,並且可以輕鬆新增新功能而不會影響現有功能。

  • 為程式碼庫提供良好的框架,程式設計師可以輕鬆地調整和修改提供的元件。

  • 提高程式碼可重用性

程序式程式設計與面向物件程式設計

程序式程式設計源於結構化程式設計,基於函式/過程/例程的概念。在程序式程式設計中,很容易訪問和更改資料。另一方面,面向物件程式設計 (OOP) 允許將問題分解成稱為物件的多個單元,然後圍繞這些物件構建資料和函式。它比過程或函式更強調資料。此外,在 OOP 中,資料是隱藏的,外部過程無法訪問。

下圖中的表格顯示了 POP 和 OOP 方法的主要區別。

程序式程式設計 (POP) 與面向物件程式設計 (OOP) 的區別。

程序式程式設計 面向物件程式設計
基於 在 POP 中,整個重點都在資料和函式上 OOP 基於現實世界場景。整個程式被分成稱為物件的小部分
可重用性 程式碼重用有限 程式碼重用
方法 自頂向下方法 面向物件設計
訪問說明符 公有、私有和保護
資料移動 資料可以在系統中的函式之間自由移動 在 OOP 中,資料可以透過成員函式相互移動和通訊
資料訪問 在 POP 中,大多數函式使用全域性資料共享,可以在系統中的函式之間自由訪問 在 OOP 中,資料不能在方法之間自由移動,它可以儲存在公有或私有中,因此我們可以控制資料的訪問
資料隱藏 在 POP 中,沒有特定的隱藏資料的方法,因此安全性較低 它提供資料隱藏,因此更安全
過載 不可能 函式和運算子過載
示例語言 C, VB, Fortran, Pascal C++, Python, Java, C#
抽象 在過程級別使用抽象 在類和物件級別使用抽象

面向物件程式設計的原則

面向物件程式設計 (OOP) 基於物件而不是動作,以及資料而不是邏輯的概念。為了使程式語言面向物件,它應該具有啟用使用類和物件以及實現和使用基本面向物件原則和概念(即繼承、抽象、封裝和多型)的機制。

Oops

讓我們簡要了解面向物件程式設計的每個支柱:

封裝

此屬性隱藏不必要的細節,並使管理程式結構更容易。每個物件的實現和狀態都隱藏在定義明確的邊界之後,這為使用它們提供了簡潔明瞭的介面。實現此目的的一種方法是將資料設為私有。

繼承

繼承,也稱為泛化,允許我們捕獲類和物件之間的層次關係。例如,“水果”是“橙子”的泛化。從程式碼重用的角度來看,繼承非常有用。

抽象

此屬性允許我們隱藏細節並僅公開概念或物件的必要特徵。例如,駕駛踏板車的人知道按下喇叭會發出聲音,但他不知道按下喇叭時聲音是如何產生的。

多型

多型意味著多種形式。也就是說,事物或動作以不同的形式或方式存在。多型的一個很好的例子是類中的建構函式過載。

面向物件的Python

Python程式設計的核心是物件OOP,但是您不必將自己限制在透過將程式碼組織成類來使用OOP。OOP 補充了 Python 的整體設計理念,並鼓勵一種簡潔實用的程式設計方式。OOP 還能夠編寫更大更復雜的程式。

模組與類和物件

模組就像“字典”

在使用模組時,請注意以下幾點:

  • Python 模組是封裝可重用程式碼的包。

  • 模組駐留在包含__init__.py檔案的資料夾中。

  • 模組包含函式和類。

  • 使用import關鍵字匯入模組。

回想一下,字典是鍵值對。這意味著如果您有一個鍵為EmployeID的字典,並且您想檢索它,那麼您必須使用以下程式碼行:

employee = {“EmployeID”: “Employee Unique Identity!”}
print (employee [‘EmployeID])

您必須按照以下流程處理模組:

  • 模組是一個包含一些函式或變數的 Python 檔案。

  • 匯入您需要的檔案。

  • 現在,您可以使用“.”(點)運算子訪問該模組中的函式或變數。

考慮一個名為employee.py的模組,其中包含一個名為employee的函式。該函式的程式碼如下:

# this goes in employee.py
def EmployeID():
   print (“Employee Unique Identity!”)

現在匯入模組,然後訪問函式EmployeID

import employee
employee. EmployeID()

您可以在其中插入一個名為Age的變數,如下所示:

def EmployeID():
   print (“Employee Unique Identity!”)
# just a variable
Age = “Employee age is **”

現在,以以下方式訪問該變數:

import employee
employee.EmployeID()
print(employee.Age)

現在,讓我們將其與字典進行比較:

Employee[‘EmployeID’] # get EmployeID from employee
Employee.employeID() # get employeID from the module
Employee.Age # get access to variable

請注意,Python 中存在一種常見模式:

  • 獲取一個key = value樣式的容器

  • 透過鍵的名稱從中獲取某些內容

將模組與字典進行比較時,兩者相似,但以下幾點除外:

  • 字典的情況下,鍵是一個字串,語法為[key]。

  • 模組的情況下,鍵是一個識別符號,語法為.key。

類就像模組

模組是一個專門的字典,可以儲存 Python 程式碼,以便您可以使用“.”運算子訪問它。類是一種將函式和資料的組合放入容器中以便您可以使用“.”運算子訪問它們的方法。

如果您必須建立一個類似於 employee 模組的類,您可以使用以下程式碼:

class employee(object):
   def __init__(self):
      self. Age = “Employee Age is ##”
   def EmployeID(self):
      print (“This is just employee unique identity”)

注意- 類優於模組,因為您可以按原樣重用它們,而且不會產生太多幹擾。而對於模組,您只有一個模組與整個程式一起使用。

物件就像迷你匯入

類就像一個迷你模組,您可以使用稱為例項化的概念,以類似於類的方式匯入它。請注意,當您例項化一個類時,您會得到一個物件

您可以例項化一個物件,類似於將類像函式一樣呼叫,如下所示:

this_obj = employee() # Instantiatethis_obj.EmployeID() # get EmployeId from the class
print(this_obj.Age) # get variable Age

您可以透過以下三種方式中的任何一種執行此操作:

# dictionary style
Employee[‘EmployeID’]
# module style
Employee.EmployeID()
Print(employee.Age)
# Class style
this_obj = employee()
this_obj.employeID()
Print(this_obj.Age)
廣告