Python編程基礎之類和對象

零、本講學習目標

  • 瞭解面向對象編程思想
  • 掌握類和對象的定義和使用
  • 瞭解Python中的對象

一、面向對象

(一)程序員“面向對象”

在現實世界中存在各種不同形態的事物,這些事物之間存在著各種各樣的聯系。在程序中使用對象來映射現實中的事物,使用對象間的關系來描述事物之間的聯系,這種思想就是面向對象。

在這裡插入圖片描述

(二)兩種編程思想實現五子棋

面向過程與面向對象的編程思想

在這裡插入圖片描述

若加入悔棋功能,面向過程和面向對象,分別怎麼實現呢?

在這裡插入圖片描述

(三)面向過程 vs. 面向對象 

面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一一實現,使用的時候依次調用就可以瞭。(POP:Procedure-Oriented Programming)

面向對象則是把構成問題的事務按照一定規則劃分為多個獨立的對象,然後通過調用對象的方法來解決問題。(OOP:Object-Oriented Programming)

(四)面向對象三大特點

面向對象是把構成問題的事務按照一定規則劃分為多個獨立的對象,然後通過調用對象的方法來解決問題。一個應用程序會包含多個對象,通過多個對象的相互配合來實現應用程序的功能,這樣當應用程序功能發生變動時,隻需要修改個別的對象就可以瞭,從而使代碼更容易得到維護。面向對象的特點主要可以概括為封裝性、繼承性和多態性。

1、封裝(encapsulation)

封裝是面向對象的核心思想,將對象的屬性(property)和行為(behavior)封裝起來,不需要讓外界知道具體實現細節。

2、繼承(inheritance)

繼承主要描述的就是類與類之間的關系,通過繼承,可以在無需重新編寫原有類的情況下,對原有類的功能進行擴展(extend)。

3、多態(polymorphism)

多態指的是在一個類中定義的屬性和功能被其他類繼承後,當把子類對象直接賦值給父類引用變量時,相同引用類型的變量調用同一個方法所呈現出的多種不同行為特性。

二、類和對象

(一)類和對象的關系

1、概述

面向對象的編程思想,力圖讓程序中對事物的描述與該事物在現實中的形態保持一致。為瞭做到這一點,面向對象的思想中提出瞭兩個概念——類和對象。

類是對某一類事物的抽象描述,而對象用於表示現實中該類事物的個體。簡而言之,類是模板(template),對象是實例(instance)。

2、示意圖

在這裡插入圖片描述

分析: 可以將上圖人看作是一個類,將每個具體的人(如小韓、小石等)看作對象,從人與具體個人之間的關系便可以看出類與對象之間的關系。

說明: 類用於描述多個對象的共同特征,它是對象的模板,而對象用於描述現實中的個體,它是類的實例。對象是類的具體化,並且一個類可以對應多個對象。

(二)類的定義

1、類的構成 

  • 類的名稱:類名,首字母必須大寫,比如Person
  • 類的屬性:一組數據,比如姓名、性別、年齡……(描述類的特征 – 靜態)
  • 類的方法:允許進行操作的方法,比如說話、步行、跑步……(描述類的行為 – 動態)

2、類定義語法格式

使用class關鍵字來聲明一個類

class 類名:
    類的屬性
    類的方法

定義的類繼承瞭一個或多個父類

class 類名(父類1, 父類2, …, 父類n):
    類的屬性
    類的方法

3、案例演示

編寫程序 – 類定義演示.py

swwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

(三)創建對象

1、語法格式

  • 利用無參構造方法創建對象:對象名 = 類名()
  • 利用有參構造方法創建對象:對象名 = 類名(參數列表)

2、給對象添加屬性

對象名.新屬性名 = 值

3、案例演示

編寫程序 – 基於類創建對象.py

在這裡插入圖片描述

運行程序,查看結果

在這裡插入圖片描述

修改對象屬性值,再訪問對象方法

在這裡插入圖片描述

  • 由此可見,在Person類裡定義三個屬性name、gender、age,所有基於該類的對象都具有同樣的初始值,然後可以根據需要修改對象的屬性值。
  • 基於Person類再創建一個對象father,調用speak()方法,修改對象屬性值,再調用speak()方法

在這裡插入圖片描述

 三、Python中的對象

(一)概述

  • 在前面,我們已使用過多種對象:整數對象、小數對象、字符串對象、函數對象、模塊對象等。
  • 用dir()函數查看一個對象有哪些屬性與方法

(二)常用對象

1、整數對象

(1)查看整數對象的屬性和方法

執行:dir(int)

['__abs__',
 '__add__',
 '__and__',
 '__bool__',
 '__ceil__',
 '__class__',
 '__delattr__',
 '__dir__',
 '__divmod__',
 '__doc__',
 '__eq__',
 '__float__',
 '__floor__',
 '__floordiv__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__index__',
 '__init__',
 '__init_subclass__',
 '__int__',
 '__invert__',
 '__le__',
 '__lshift__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__neg__',
 '__new__',
 '__or__',
 '__pos__',
 '__pow__',
 '__radd__',
 '__rand__',
 '__rdivmod__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rfloordiv__',
 '__rlshift__',
 '__rmod__',
 '__rmul__',
 '__ror__',
 '__round__',
 '__rpow__',
 '__rrshift__',
 '__rshift__',
 '__rsub__',
 '__rtruediv__',
 '__rxor__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__sub__',
 '__subclasshook__',
 '__truediv__',
 '__trunc__',
 '__xor__',
 'as_integer_ratio',
 'bit_length',
 'conjugate',
 'denominator',
 'from_bytes',
 'imag',
 'numerator',
 'real',
 'to_bytes']

(2)案例演示

查看整數的字節長度 - bit_length()

在這裡插入圖片描述

327的二進制位數是9,調用bin()函數將其轉換成二進制:101000111(9位)

查看復數的實部和虛部

在這裡插入圖片描述

整數轉換成字節數據 – to_bytes()

在這裡插入圖片描述

演示將整數1345轉換成字節數據

在這裡插入圖片描述

演示將字節數據轉換成整數

在這裡插入圖片描述

演示冪運算 – __pow__()

在這裡插入圖片描述

演示比較運算

在這裡插入圖片描述

2、小數對象

(1)查看小數對象的屬性和方法

執行:dir(float)

['__abs__',
 '__add__',
 '__bool__',
 '__class__',
 '__delattr__',
 '__dir__',
 '__divmod__',
 '__doc__',
 '__eq__',
 '__float__',
 '__floordiv__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getformat__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__int__',
 '__le__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__neg__',
 '__new__',
 '__pos__',
 '__pow__',
 '__radd__',
 '__rdivmod__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rfloordiv__',
 '__rmod__',
 '__rmul__',
 '__round__',
 '__rpow__',
 '__rsub__',
 '__rtruediv__',
 '__set_format__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__sub__',
 '__subclasshook__',
 '__truediv__',
 '__trunc__',
 'as_integer_ratio',
 'conjugate',
 'fromhex',
 'hex',
 'imag',
 'is_integer',
 'real']

(2)案例演示

保留小數位數 - __round__()

在這裡插入圖片描述

演示冪運算 – __pow__()

在這裡插入圖片描述

3、字符串對象

(1)查看字符串對象的屬性和方法

執行:dir(str)

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'capitalize',
 'casefold',
 'center',
 'count',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'format_map',
 'index',
 'isalnum',
 'isalpha',
 'isascii',
 'isdecimal',
 'isdigit',
 'isidentifier',
 'islower',
 'isnumeric',
 'isprintable',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'maketrans',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']

(2)案例演示

判斷字符串是不是全為數字構成 – isdigit()

在這裡插入圖片描述

判斷字符串是不是全為字母構成 – isalpha()

在這裡插入圖片描述

4、函數對象

定義函數

在這裡插入圖片描述

查看函數類型

在這裡插入圖片描述

將函數對象賦值給變量

在這裡插入圖片描述

5、模塊對象

導入模塊並查看類型

在這裡插入圖片描述

訪問模塊的屬性與函數

在這裡插入圖片描述

將模塊對象賦值給變量

在這裡插入圖片描述

 (三)兩種對象

在Python的對象模型中,有兩種對象:類對象和實例對象。類對象是在執行class語句時創建的,而實例對象是在調用類的時候創建的。每調用一次類,便創建一個實例對象。類對象隻有一個,而實例對象可以有多個。類對象和每個實例對象都分別擁有自己的命名空間,在各自的命名空間內存儲屬於自己的數據。

1、類對象

  • Python執行class語句時創建一個類對象和一個變量(名稱就是類名稱),變量引用類對象。與def類似,class也是可執行語句。導入類模塊時,class語句被執行,創建類對象。
  • 類中的賦值語句創建的變量是類的數據屬性。與模塊類似,類中的頂層賦值語句創建的變量才屬於類對象。類的數據數據用“對象名.屬性名”格式來訪問。
  • 類中的def語句定義的函數是類的方法屬性,用“對象名.方法名()”格式來訪問。

類的數據和方法由所有的實例對象共享。

2、實例對象

  • 實例對象通過調用類對象來創建(就像調用函數一樣來調用類對象)。
  • 每個實例對象繼承類對象的屬性,並獲得自己的命名空間。
  • 實例對象的“私有”屬性。類的方法函數的第一個參數默認為self,表示引用方法的對象實例。在方法中對self的屬性賦值才會創建屬於實例對象的屬性。

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!    

推薦閱讀: