Python面向對象基礎

語言分類

面向機器

抽象成機器指令,讓機器容易理解

代表:匯編語言

面向過程

按照步驟一步一步走,若出現情況A做相應的處理,若出現情況B做相應的處理

問題規模小,可以步驟化,按部就班處理

代表:C

面向對象OOP

計算機需要處理的問題的規模越來越大,需要多人、多部門協作

代表:C++、Java、Python

面向對象

一種認識世界、分析世界的方法論。將萬事萬物抽象成類

類class

抽象的概念,世間萬物的抽象,是一類事物的共同特征的集合

用計算機語言來描述類——屬性和方法的集合

對象instance、object

對象是類的具象,是一個實體

每個人個體都是抽象概念人類的不同的實體

屬性:是對象狀態的抽象,用數據結構來描述

操作:是對象行為的抽象,用操作名和實現該操作的方法類描述

?
?

哲學思想

一切皆對象

對象是數據和操作的封裝

對象是獨立的,但相互之間可以相互操作

目前OOP是最接近人類認知的編程范式

面向對象的3要素

封裝

組裝:將數據和操作結合在一起

隱藏數據:對外只暴露一些接口,通過接口來訪問對象

繼承

多復用,繼承來的不用在重復寫

多繼承少修改,OCP(Open-Closed Principle),使用繼承來改變和體現個性

多態

動態綁定,面向對象編程最靈活的地方

Python的類

定義

class ClassName:

語句塊

使用class關鍵字

類名必須使用大駝峰

類定義完成后,就產生一個類對象,綁定到標識符ClassName上

????????Python面向對象基礎

類對象及類屬性

類對象:類的定義即會生成一個類對象

類的屬性:類定義中的變量和方法都是類的屬性

類變量:x即為MyClass的變量

foo方法是類的屬性,只有實例才能調用

Foo是方法對象method,不再是普通的函數對象function,一般要求至少有一個參數,第一個參數可以是self,self指代當前實例本身

實例化

a = MyClass()

在類對象名稱后面加上一個括號,就調用類的實例化方法,完成實例化

實例化創建一個該類的對象(實例)

每次實例化后獲得的實例都是不同的實例,即使使用相同的參數實例化,也得到不一樣的對象

Python類實例化后,會自動調用__init__方法,該方法將第一個參數必須留給self,其他參數任意

__init__方法

MyClass實際調用的是__init__(self)方法,可不定義,若沒有定義會在實例化后隱式調用

__init__()方法不能有返回值,只能是None

作用:對實例進行初始化

????????????Python面向對象基礎

初始化函數可以有多個參數,但第一個位置必須是self

????????????Python面向對象基礎

實例對象instance

類實例化后一定會獲得一個對象——實例對象

__init__方法的第一個參數self就是指代某一個實例

類實例化后,得到一個實例化對象,實例化對象會綁定方法

方法的調用者會被作為第一個參數self的實參傳入

self.name就是bob對象的name,name保存在bob對象上,而非Person類上,稱為實例變量

self

self就是調用者,就是c對應的實例對象

self僅為慣例,可以修改為其他名稱,一般不做修改以保證代碼的可讀性

實例變量和類變量

實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法

特殊屬性

含義

__name__

對象名

__class__

對象的類型

__dict__

對象的屬性的字典

__qualname__

類的限定名

python中每一種對象都擁有不同的屬性,函數、類都為對象,類的實例也是對象

????????Python面向對象基礎

類屬性保存在類的__dict__中,實例屬性保存在實例的__dict__中,借助__class__找到實例所屬的類可以實現從實例訪問類的屬性

總結

變量是類的,也是這個類所有實例的,其實例都可以訪問到;變量是實例的,通過類無法訪問到

類變量是屬于類的變量,這個類的所有實例可以共享該變量

實例可以動態的為自己增加一個屬性,instance.__dict__[變量名]和instance.變量名都可以訪問到

實例的同名變量會隱藏這個類變量,即覆蓋了該類變量

類變量使用全大寫來命名

實例屬性的查找順序

實例通過.來訪問屬性,會先查找自己的__dict__,若沒有則通過屬性__class__找到自己的類,再到類的__dict__中查找

實例使用__dict__[變量名]訪問變量,則不會查找類中的屬性

類的裝飾

????????Python面向對象基礎

裝飾的本質就是為;類對象動態的添加一個屬性

類方法和靜態方法

普通函數

無參函數在定義時沒有指定self,不能完成實例對象的綁定,無法使用

類方法

????????Python面向對象基礎

在類定義中,使用@classmethod裝飾器裝飾的方法

必須至少一個參數,且第一個參數留給cls,cls指代調用者即類對象自身

cls可為任意其他字符串,不建議修改保證可讀性

通過cls可以直接操作類的屬性

靜態方法

????????Python面向對象基礎

在類定義中,使用@staticmethod裝飾器裝飾的方法

調用時不會隱式傳入諸如self、cls之類的參數

靜態方法,只是表明該方法屬于這個名詞空間,函數放在一起方便組織和管理

方法的調用

類幾乎可以調用內部定義的所有方法,但是調用普通方法時會報錯,原因是必須有self參數

實例幾乎可以調用所有的方法,普通函數的調用一般不使用,不允許該種定義

總結

類除了普通方法都可以調用,普通方法需要對象的實例作為第一個參數

實例可以調用所有類中定義的方法(包括classmethod、staticmethod),普通方法傳入實例自身,靜態方法和類方法需要找到實例的類

訪問控制

私有(private)屬性

使用雙下劃線開頭的屬性名

????????????Python面向對象基礎

外部無法訪問__age

可使用方法來訪問

????????????Python面向對象基礎

私有變量的本質

????????????Python面向對象基礎

類定義的時候,如果使用雙下劃線開頭聲明一個實例變量,Python解釋器會將其改名,轉換為_類名__變量名 的名稱

可是使用私有變量特定格式的名稱從外部訪問私有變量,并修改它

保護變量

在變量名前使用一個下劃線

????????????Python面向對象基礎

并未改變名稱,和普通屬性一樣,解釋器不做任何特殊處理

只是一種約定,提示開發者不要直接使用該變量

私有方法

和保護變量、私有變量一樣使用單下劃線、雙下劃線命名的方法

????????????Python面向對象基礎

本質

單下劃線的方法只是開發者的約定,解釋器不做任何修改

雙下劃線的方法是私有方法,解釋器會改名,_類名__方法名,,保存在類的__dict__中

屬性裝飾器

好的設計:將實例的屬性保護起來,不讓外部直接訪問,外部使用getter和setter讀取或設置屬性

????????Python面向對象基礎

使用property裝飾器時者三個方法同名

property裝飾器:后面跟的函數名就是以后的屬性名,即是getter,這個必須有,有了它至少是只讀屬性

setter裝飾器:與屬性名同名,且接收2個參數,第一個為self,第二個為要賦值的值,有了它,屬性可寫

deleter裝飾器:可以將屬性刪除,很少用

property必須在前,setter、deleter在后

property通過簡單的方式,將對方法的操作變成對屬性的訪問,并起到一定的隱藏效果

原創文章,作者:ZBD20,如若轉載,請注明出處:http://www.www58058.com/97655

(0)
ZBD20ZBD20
上一篇 2018-05-06 20:05
下一篇 2018-05-06 20:46

相關推薦

欧美性久久久久