Python 面向對象編程

2020-10-11 人工智慧科技時代

在學習面向對象編程時,我決定深入研究它的歷史,結果發現它很迷人。術語「面向對象編程」(OOP)是Alan Kay 在1966年研究生院時提出的。

Simula語言是第一種具有面向對象編程特點的程式語言。它是在1967年開發的,用於製作模擬程序,其中最重要的信息稱為對象。

儘管OOPS自20世紀60年代初就在市場上,但在20世紀90年代,OOPS開始因為C++而增長。

除此之外,這種編程技術已經被包括Python在內的各種程式語言所採用,它的應用幾乎遍及所有領域,如實時系統、人工智慧、專家系統、CS系統、面向對象資料庫等等。

因此,在本文中,我將解釋Python中面向對象編程的基本概念。

目錄

  1. 什麼是面向對象編程?
  2. 面向對象編程(OOP)與面向過程編程(POP)
  3. OOPs的主要概念
  4. 什麼是類?
  5. 對象和對象實例化
  6. 類方法
  7. Python類中的繼承
  8. 封裝
  9. 多態性
  10. 數據抽象

什麼是面向對象編程?

面向對象編程(OOP)就是創建「對象」。對象是一組相互關聯的變量和函數。這些變量通常稱為對象的屬性,函數稱為對象的行為。這些對象為程序提供了一個更好、更清晰的結構。

例如,汽車可以是一個對象。如果我們把汽車當作一個對象,那麼它的屬性就是——顏色、型號、價格、品牌等等,它的行為/函數是加速、減速、換擋。

另一個例子——如果我們把狗當作一個物體,那麼它的屬性就是——它的顏色、品種、名字、體重等,而它的行為/函數是行走、吠叫、玩耍等。

面向對象編程因其在編程中實現了對象、隱藏、繼承等現實實體而聞名。它使可視化更容易,因為它接近真實世界的場景。

面向對象編程(OOP)與面向過程編程(POP)

OOP和過程式編程的基本區別是

  • 一種思考POP的方法就是你做檸檬水的方式。製作檸檬水的過程包括——首先根據需要取水,然後在水中加入糖,然後在混合物中加入檸檬汁,最後將整個溶液混合。這樣你的檸檬水就準備好了。同樣,POP也需要一定的步驟。程序程序由函數組成。這意味著在POP方法中,程序被劃分為特定於不同任務的函數。這些功能按特定的順序排列,程序的控制按順序進行。
  • 而OOP程序是由對象組成的。面向對象方法將程序劃分為對象。這些對象是將現實世界對象的屬性和行為捆綁在一起的實體。
  • POP只適用於小任務。因為隨著程序長度的增加,代碼的複雜性也隨之增加。最後變成了一個函數網。而且,它變得很難調試。OOP通過更清晰、以更不複雜的結構來解決這個問題。它允許以繼承的形式重新使用代碼。
  • 另一個重要的是,在面向過程的編程中,所有函數都可以訪問所有數據,這意味著缺乏安全性。假設你想保護來自世界各地的憑據或任何其他關鍵信息。那麼程序化方法就不能為你提供這種安全性。因為這個OOP幫助你實現了一個稱為封裝的驚人功能,它允許我們隱藏數據。不用擔心,在本文的後半部分,我將詳細介紹這一點以及面向對象編程的其他概念。現在,只需理解OOP支持安全性,POP不支持。
  • 程式語言如C、Pascal和Basic使用過程方法,而java、Python、JavaScript、PHP、Scala和C++是提供面向對象方法的主要語言。

OOPs的主要概念

在本節中,我們將深入探討OOP的基本概念。我們將討論以下主題

  1. 對象
  2. 方法
  3. 繼承
  4. 封裝
  5. 多態性
  6. 數據抽象

1.什麼是類?

這個問題的直接答案是:類是對象的集合。與原始數據結構不同,類是用戶定義的數據結構。它們使代碼更易於管理。

讓我們看看如何定義下面的類

class class_name:class body

我們用關鍵字「class」在類名和分號後面定義一個類。在使用縮進之後,我們會考慮有縮進的所有東西。為了讓這更容易理解,讓我們看一個例子。

以汽車展廳為例。你要存儲每輛車的詳細信息。讓我們首先定義一個類

class Car:pass

就這樣!

注意:我用pass語句代替了它的主體,因為主要目的是展示如何定義一個類,而不是它應該包含什麼。

在詳細介紹之前,首先要了解對象和實例化。

2.對象和對象實例化

當我們定義一個類時,只會創建對象的描述或藍圖,在這個過程中沒有內存分配。而對象實例具有內存分配,它包含真實的數據或信息。

實例化是創建一個類的實例。讓我們創建上面定義的類的對象-

obj1 = Car()

這樣就創建了一個對象實例。請注意,你可以根據你的選擇更改對象名稱。

嘗試列印此對象

print(obj1)

因為我們的類是空的,所以它返回存儲對象的地址,即0x7fc5e677b6d8

在繼續學習之前,你還需要了解類的構造函數。

類構造函數

到目前為止,我們有一輛空的車,是時候把車的特徵填滿我們的類了。類構造函數的工作是在創建類的對象時將值分配給類的數據成員。

一輛車可以有不同的屬性,如名稱、顏色、型號、品牌、發動機功率、重量、價格等。我們將僅選擇其中幾項以便於理解。

class Car:def __init__(self, name, color):

self.name = name

self.color = color

因此,car或任何其他對象的屬性必須位於一個我們稱為 **__init__( )**的方法中。此方法也稱為構造函數方法。每當類的對象被構造時,就調用構造函數方法。

現在,讓我們來討論一下 **__init__( )**方法的參數。所以,這個方法的第一個參數必須是self。然後才是剩下的參數

構造函數方法中的兩個語句是

  1. self.name = name
  2. self.color = color:

這將創建新的屬性,即name和color,然後將參數的值分配給它們。「self」關鍵字表示類的實例。通過使用「self」關鍵字,我們可以訪問類的屬性和方法。它在方法定義和變量初始化中很有用。「self」在每次定義方法時都顯式使用。

注意:你也可以在此方法之外創建屬性。但是這些屬性對整個類都是通用的,必須給它們賦值。

假設你的展廳中的所有汽車都是Sedan,而不是一次又一次地指定它,你可以通過創建一個屬性來將car_type的值固定為Sedan。

class Car:

car_type = "Sedan" #類屬性def __init__(self, name, color):

self.name = name #實例屬性self.color = color #實例屬性

這裡,實例屬性是指構造函數方法中的屬性,在這個例子中是self.name 和 self.color。類屬性是指構造函數方法之外的屬性,在這個例子中是car_type。

3.類方法

到目前為止,我們已經添加了汽車的屬性。現在是時候添加一些行為了。方法是我們用來描述對象行為的函數。它們也在類中定義。請看下面的代碼

class Car:

car_type = "Sedan"

def __init__(self, name, mileage):

self.name = name

self.mileage = mileage

def description(self):

return f"The {self.name} car gives the mileage of {self.mileage}km/l"

def max_speed(self, speed):

return f"The {self.name} runs at the maximum speed of {speed}km/hr"

在類中定義的方法(而不是構造函數方法)稱為實例方法。此外,這裡有兩個實例方法,description()和max_speed()。

  • description()—此方法返回一個字符串,其中包含汽車的描述,如名稱和裡程數。此方法沒有其他參數。此方法正在使用實例屬性。
  • max_speed()—此方法有一個附加參數,並返回一個顯示車輛名稱及其速度的字符串。

請注意,附加參數speed沒有使用「self」關鍵字。因為speed不是一個實例變量,所以我們不使用self關鍵字作為前綴。讓我們為上面描述的類創建一個對象。

obj2 = Car("Honda City",24.1)

print(obj2.description())

print(obj2.max_speed(150))

我們所做的是創建一個類car的對象並傳遞所需的參數。為了使用object_name.method_name().

description()方法沒有任何附加參數,因此在調用它時沒有傳遞任何參數。

max_speed()方法有一個附加參數,因此我們在調用它時傳遞了一個參數。

注意:三件重要的事要記住

  1. 可以創建一個類的任意數量的對象。
  2. 如果方法需要n個參數,而你沒有傳遞相同數量的參數,則會發生錯誤。
  3. 參數的順序很重要。

讓我們一個個來看看

  1. 創建一個類的多個對象

class Car:def __init__(self, name, mileage):

self.name = name

self.mileage = mileage

def max_speed(self, speed):

return f"The {self.name} runs at the maximum speed of {speed}km/hr"

Honda = Car("Honda City",21.4)

print(Honda.max_speed(150))

Skoda = Car("Skoda Octavia",13)

print(Skoda.max_speed(210))

  1. 參數數目錯誤

class Car:

def __init__(self, name, mileage):

self.name = name

self.mileage = mileage

Honda = Car("Honda City")

print(Honda)

因為我們沒有提供第二個參數,所以我們得到了這個錯誤。

  1. 參數順序

class Car:

def __init__(self, name, mileage):

self.name = name

self.mileage = mileage

def description(self):

return f"The {self.name} car gives the mileage of {self.mileage}km/l"

Honda = Car(24.1,"Honda City")

print(Honda.description())

搞混了!因為我們改變了論點的順序。

現在,面向對象編程有四個基本概念:繼承、封裝、多態和數據抽象。為了理解OOPs,了解所有這些非常重要。到目前為止,我們已經介紹了面向對象編程的基本知識,讓我們進一步深入。

4. Python類中的繼承

繼承是一個類繼承另一個類的屬性和方法的過程。被繼承的類稱為父類。從父類繼承屬性的類是子類。

有趣的是,除了繼承的屬性和方法外,子類可以有自己的屬性和方法。

如何繼承父類?使用以下語法:

class parent_class:

body of parent class

class child_class( parent_class):

body of child class

讓我們看看實現

class Car: #父類

def __init__(self, name, mileage):

self.name = name

self.mileage = mileage

def description(self):

return f"The {self.name} car gives the mileage of {self.mileage}km/l"

class BMW(Car): #子類pass

class Audi(Car): #子類def audi_desc(self):return "This is the description method of class Audi."

obj1 = BMW("BMW 7-series",39.53)

print(obj1.description())

obj2 = Audi("Audi A8 L",14)

print(obj2.description())

print(obj2.audi_desc())

我們創建了兩個子類,即「BMW」和「Audi」,它們繼承了父類「Car」的方法和屬性。在BMW類我們沒有提供額外的特徵和函數。而Audi內部的一個附加方法。

注意在obj1.description()和obj2.description()的幫助下,父類的實例方法description()是如何被子類的對象訪問的。此外,還可以使用obj2.Audi_desc()訪問Audi類的單獨方法。

5.封裝

正如我在文章開頭部分提到的,封裝是確保安全性的一種方法。基本上,它將數據隱藏起來,不讓外人訪問。例如,如果我們想讓某些值不被客戶或任何未經授權的人訪問,那麼封裝就是確保這一點的方法。

你可以在方法或屬性的名稱前使用一個下劃線( _ ) 來聲明受保護的方法或屬性。例如 self._name或def _method();這兩行都說明屬性和方法是受保護的,不應在類和子類的訪問之外使用,而是可以由類方法和對象訪問。

Python只是將『_『 用作編碼約定,告訴你應該在類的範圍內使用這些屬性/方法。你仍然可以像往常一樣訪問定義為受保護的變量和方法。

現在,為了實際防止從類範圍之外訪問屬性/方法,可以使用「私有成員」。若要將屬性/方法聲明為私有成員,請在前綴中使用雙下劃線( __ ) 。例如– self.__name或def __method();這兩行都說明屬性和方法是私有的,不能從類外部進行訪問。

class car:

def __init__(self, name, mileage):

self._name = name #受保護屬性self.mileage = mileage

def description(self):

return f"The {self._name} car gives the mileage of {self.mileage}km/l"

obj = car("BMW 7-series",39.53)

#通過類方法訪問受保護變量

print(obj.description())

#直接從外部訪問受保護變量

print(obj._name)

print(obj.mileage)

請注意我們如何訪問受保護的變量而沒有任何錯誤。很明顯,對變量的訪問仍然是公開的。讓我們看看封裝是如何工作的

class Car:

def __init__(self, name, mileage):

self.__name = name #私有變量self.mileage = mileage

def description(self):

return f"The {self.__name} car gives the mileage of {self.mileage}km/l"

obj = Car("BMW 7-series",39.53)

#通過類方法訪問私有變量

print(obj.description())

#直接從外部訪問私有變量

print(obj.mileage)

print(obj.__name)

當我們嘗試使用description()方法訪問私有變量時,沒有遇到任何錯誤。但是當我們嘗試直接在類外部訪問私有變量時,Python給出了一個錯誤,聲明:car對象沒有屬性''__name'。

你仍然可以使用該屬性的修飾名稱直接訪問它。Name mangling(命名修飾)是一種從外部訪問類成員的機制。Python解釋器將任何帶有「__var」的標識符重寫為「_ClassName__var」。使用這個你可以從外部訪問類成員。

class Car:

def __init__(self, name, mileage):

self.__name = name #私有變量 self.mileage = mileage

def description(self):

return f"The {self.__name} car gives the mileage of {self.mileage}km/l"

obj = Car("BMW 7-series",39.53)

#通過類方法訪問私有變量

print(obj.description())

#直接從外部訪問私有變量

print(obj.mileage)

print(obj._car__name) #名稱修飾

請注意,這個規則的設計是想處理某些情況,例如在調試器中。但是正常編程中不推薦使用

6.多態

多態(Polymorphism)一個希臘單詞。如果我們分解Polymorphism這一術語,我們會得到「poly」(多)和「morph」(變形)形式。所以多態性意味著有多種形式。在OOP中,它指的是具有相同名稱但具有不同功能的函數。

class Audi:def description(self):

print("This the description function of class AUDI.")

class BMW:def description(self):

print("This the description function of class BMW.")

audi = Audi()

bmw = BMW()

for car in (audi,bmw):

car.description()

使用對象audi調用函數時,將調用audi類的函數;使用對象bmw調用函數時,將調用bmw類的函數。

7.數據抽象

我們使用抽象來隱藏函數的內部細節或實現,只顯示其功能。這與你在不知道汽車原理的情況下知道如何駕駛汽車,或者你知道如何用開關打開或關閉燈,但你不知道插座後面發生了什麼的情況類似。

任何具有至少一個抽象函數的類都是抽象類。為了首先創建一個抽象類,你需要從ABC模塊導入ABC類。這使你可以在其中創建抽象方法。ABC代表抽象基類。

from abc import ABC

class abs_class(ABC):

Body of the class

重要的是,不能為抽象類創建實例對象。例如-

from abc import ABC, abstractmethod

class Car(ABC):def __init__(self,name):

self.name = name

@abstractmethoddef price(self,x):pass

obj = Car("Honda City")

現在的問題是我們如何準確地使用這個抽象。答案是使用繼承。

from abc import ABC, abstractmethod

class Car(ABC):def __init__(self,name):

self.name = name

def description(self):

print("This the description function of class car.")

@abstractmethoddef price(self,x):pass

class new(Car):def price(self,x):

print(f"The {self.name}'s price is {x} lakhs.")

obj = new("Honda City")

obj.description()

obj.price(25)

Car是從ABC模塊的ABC類繼承的抽象類。注意我在抽象類中有一個抽象方法(price())和一個具體方法(description())。這是因為抽象類可以同時包含這兩種類型的函數,而普通類則不能。從這個抽象類繼承的另一個類是new。new的price()方法是我們重寫了抽象類Car的price方法。

在用戶從new()類創建對象並調用price()方法之後,new()類中price方法的定義就開始發揮作用了。這些定義對用戶是隱藏的。抽象方法只是提供一個聲明。需要提供子類的定義。

但是,當為new()類(即obj)的對象調用description()方法時,將調用Car的description()方法,因為它不是抽象方法。

相關焦點

  • 如何理解 Python 中的面向對象編程?
    現如今面向對象編程的使用非常廣泛,本文我們就來探討一下Python中的面向對象編程。作者 | Radek Fabisiak譯者 | 彎月,責編 | 郭芮以下為譯文:Python支持多種類型的編程範式,例如過程式編程、函數式編程、面向對象編程,而且還可以融合多種類型的範式。
  • Python面向對象編程的一些見解
    另外,我們也需要一種學習方法保持我們的學習熱情, Python作為一門程式語言,涉及很多領域,所以它也包含了眾多的知識點,不同的領域涉及到的知識點也有所不同。正文:閒話說完,進入正題,Python語言是一門面向對象的語言,今天我們就講一下什麼是面向對象。面向對象編程已經成為一種現代程式設計師不可或缺的技能。那到底什麼是面向對象編程呢?這讓很多初學者不是很理解,進而導致他們放棄深入學習編程。
  • opencv-python獲取圖像:面向對象與面向過程
    下面是分別用面向過程與面向對象的編程方法實現讀取本地圖像和打開攝像頭兩段代碼:# -*- coding: utf-8 -*-"""面向過程的編程方法,用函數把解決問題的步驟一步一步實現。運行環境:win10系統 python==3.6 opencv-contrib-python== 4.1.0第一行「# -*- coding: utf-8 -*-」 告訴Python解釋器,按照UTF-8編碼讀取原始碼"""import cv2image=cv2.imread('lena.JPG') #讀取本地圖片,
  • Python面向對象編程的基本概念
    由九道門商業數據分析學院提供介紹在學習面向對象的編程時。我決定深入了解它的歷史,結果令人著迷。術語「面向對象程序設計」(OOP)是艾倫·凱(Alan Kay)在1966年讀研究生時提出的。名為Simula的語言是第一種具有面向對象編程功能的程式語言。它是在1967年開發的,用於製作仿真程序,其中最重要的信息稱為對象。
  • 資料|Python面向對象編程課件
    from=leiphonecolumn_res0928內容簡介Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。如果你以前沒有接觸過面向對象的程式語言,那你可能需要先了解一些面向對象語言的一些基本特徵,在頭腦裡頭形成一個基本的面向對象的概念,這樣有助於你更容易的學習Python的面向對象編程。
  • 初識Python面向對象
    此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數二、面向對象編程1.面向對象or面向過程面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作為程序的基本單 元,一個對象包含了數據和操作數據的函數。面向過程的程序設計把電腦程式視為一系列的命令集合,即一組函數的順序執行。
  • 趣味解讀Python面向對象編程 (類和對象)
    一、面向對象簡介考慮現實生活中,我們的思維方式是放在學生這個個人上,是學生做了自我介紹。而不是像我們剛剛寫出的代碼,先有了介紹的行為,再去看介紹了誰。用我們的現實思維方式該怎麼用程序表達呢?面向過程:根據業務邏輯從上到下寫代碼。面向對象:將數據與函數綁定到一起,進行封裝,這樣能夠更快速的開發程序,減少了重複代碼的重寫過程。面向過程編程最易被初學者接受,其往往用一長段代碼來實現指定功能,開發過程的思路是將數據與函數按照執行的邏輯順序組織在一起,數據與函數分開考慮。
  • 詳解Python面向對象知識點
    目前代碼技能已經成了測試同學面試考核的剛需,對於測試開發來講需求最大的是java和python兩門語言,二者也都是面向對象語言。對於剛入門代碼的同學來說面向對象相關的概念比較難於理解,而面向對象編程相關的知識點偏偏又是面試中的高頻問題,所以本文我以python為例,帶大家快速搞定面向對象中的核心概念並通過代碼實現的方式來幫助大家對其加深理解!
  • python面向對象這些概念不了解你怎麼學
    在常見的編程範式裡面有兩種比較常用的,一種是函數式編程、一種是面向對象, 面向對象是一個非常大的話題,筆者不敢亂言, 本文只是面向對象一些概念的理解,然後聊聊復用這回事廣義上類的組成在之前的文章中函數介紹中提過,函數是一個控制抽象,同時也提到面向對象是數據抽象, 其實從上面我們可以看出
  • python入門教程 「奇異博士大戰滅霸」面向對象編程項目實戰
    python入門教程入門教程 [大戰]面向對象編程項目實戰奇異博士和滅霸的血量(HP),都為500他們兩人都是真正的君子,決定採用回合制來展開攻擊,每一次攻擊,對方隨機掉血(10-50)由於你幫助,奇異博士有15%的機率可以防住滅霸的攻擊,傷害為0當有一人血量 ≤ 0 時,結束戰鬥,對方獲勝讓我們用面向對象的編程思維來分析這次對戰
  • 面向對象的程式語言
    在剛開始介紹到JAVA時,我們就提到說JAVA是一種面向對象的程式語言。我們在代碼編寫的時候用到的說到的最多的就是new一個對象,那麼什麼是對象,面向對象有哪些特點,與面向過程的編程有什麼區別。對象和類的理解萬物皆對象,現實世界是由很多很多對象組成的,我們可以理解為每一種事物就是一個對象,對象就是事物存在的個體。比如一輛車、一個人等都是一個對象。每一個對象都有屬於自己的屬性和行為方法,如人類都有自己的姓名、性別、年齡等屬性,還會有學習、工作等屬性。不過不同的對象有著不同的屬性。類定義了一種抽象數據類型,代表了一個類別,一類個體。
  • python教程之十一面向對象
    面向對象技術簡介不管何種語言,我們都提倡採用面向對象思想編程。上節我們介紹了GUI界面,下面代碼採用tkinter庫實現登陸界面來解釋說明面向對象技術涉及到的幾個術語。1、類(Class): 具有相同屬性和方法的對象的集合。定義了Login類,類定義的語法為 class className:2、方法:類中定義的函數。
  • python入門——面向對象編程基礎到進階之枚舉類Enum
    ## 文章目錄 面向對象編程 @property 使用枚舉類 # 面向對象編程 ## @property 為了避免實例對象屬性的值被隨意修改
  • python之面向對象編程(四)多態與抽象
    多態面向對象編程中抽象面向對象編程中>總結多態和抽象在面向對象編程中是非常重要的兩個概念
  • 跟我學java編程—面向對象的編程思想
    當前軟體開發領域有兩大編程思想,一個是面向過程的編程思想,一個是面向對象的編程思想。依據編程思想的不同,程式語言也分為面向過程的語言和面向對象的語言。Java、NET等是面向對象的語言,C語言、Fortran等是面向過程的語言。
  • 面向對象編程OOP的基本概念
    1、類和對象面向對象編程的兩個重要概念:類(class)和對象(object)。類是抽象的概念,對象是具體的東西。在面向對象編程的世界中,一切皆為對象,對象都有屬性(數據)和行為(方法),每個對象都是獨一無二的,而且對象一定屬於某個類。當把擁有共同特徵的對象的靜態特徵(屬性)和動態特徵(行為)抽取出來之後,就可以定義出類。
  • 深入淺出理解面向過程與面向對象編程
    前言有過編程的經歷的讀者可能經常會聽到面向過程編程和面向對象編程,然後你是否去深入了解過這兩個概念,它們之間有什麼區別,下面我就來簡單介紹一下。而面向對象的我會這樣做:開打出行APP選擇坐飛機還是火車,選擇哪一班車,選擇完畢,去車站坐車,到達目的地。
  • 面向對象編程-類與對象
    面向對象的思想中,對象就是特徵和技能的結合體。在具體的軟體開發方法中,對象就是把相關的數據和方法組織到一起的整體。 而類則是對象的概念抽象。在生活中是先有對象再有類,程序中是先有類才能有對象。對象的含義是指具體的某一個事物,即在現實生活中能夠看得見摸得著的事物。類是具有相同特性(數據元素)和行為(功能)的對象的抽象。
  • 面向對象編程的災難:是時候考慮更新換代了!
    包絡高級技術人員在內的很多人認為面向對象編程是代碼組織的標準,這是不正確的。同樣不可接受的是,除面對對象編程之外,許多主流語言都沒有提供任何代碼組織的替代方案。面向對象編程可以作為正確程序的替代品。Edsger W.
  • 面向過程和面向對象程式語言有何不同
    首先,面向對象程式語言和面向過程程式語言都是操作計算機的方式,從本質上來說也都是操作計算機執行任務的工具,只是方式上的不同而已。面向過程程式語言故名思議,以業務流程為考慮問題的出發點,從上到下按照解決問題的流程來組織代碼結構,把功能封裝成函數,然後依次調用就可以了。