語言分類
面向機器
抽象成機器指令,讓機器容易理解
代表:匯編語言
面向過程
按照步驟一步一步走,若出現情況A做相應的處理,若出現情況B做相應的處理
問題規模小,可以步驟化,按部就班處理
代表:C
面向對象OOP
計算機需要處理的問題的規模越來越大,需要多人、多部門協作
代表:C++、Java、Python
面向對象
一種認識世界、分析世界的方法論。將萬事萬物抽象成類
類class
抽象的概念,世間萬物的抽象,是一類事物的共同特征的集合
用計算機語言來描述類——屬性和方法的集合
對象instance、object
對象是類的具象,是一個實體
每個人個體都是抽象概念人類的不同的實體
屬性:是對象狀態的抽象,用數據結構來描述
操作:是對象行為的抽象,用操作名和實現該操作的方法類描述
?
?
哲學思想
一切皆對象
對象是數據和操作的封裝
對象是獨立的,但相互之間可以相互操作
目前OOP是最接近人類認知的編程范式
面向對象的3要素
封裝
組裝:將數據和操作結合在一起
隱藏數據:對外只暴露一些接口,通過接口來訪問對象
繼承
多復用,繼承來的不用在重復寫
多繼承少修改,OCP(Open-Closed Principle),使用繼承來改變和體現個性
多態
動態綁定,面向對象編程最靈活的地方
Python的類
定義
class ClassName:
語句塊
使用class關鍵字
類名必須使用大駝峰
類定義完成后,就產生一個類對象,綁定到標識符ClassName上
????????
類對象及類屬性
類對象:類的定義即會生成一個類對象
類的屬性:類定義中的變量和方法都是類的屬性
類變量:x即為MyClass的變量
foo方法是類的屬性,只有實例才能調用
Foo是方法對象method,不再是普通的函數對象function,一般要求至少有一個參數,第一個參數可以是self,self指代當前實例本身
實例化
a = MyClass()
在類對象名稱后面加上一個括號,就調用類的實例化方法,完成實例化
實例化創建一個該類的對象(實例)
每次實例化后獲得的實例都是不同的實例,即使使用相同的參數實例化,也得到不一樣的對象
Python類實例化后,會自動調用__init__方法,該方法將第一個參數必須留給self,其他參數任意
__init__方法
MyClass實際調用的是__init__(self)方法,可不定義,若沒有定義會在實例化后隱式調用
__init__()方法不能有返回值,只能是None
作用:對實例進行初始化
????????????
初始化函數可以有多個參數,但第一個位置必須是self
????????????
實例對象instance
類實例化后一定會獲得一個對象——實例對象
__init__方法的第一個參數self就是指代某一個實例
類實例化后,得到一個實例化對象,實例化對象會綁定方法
方法的調用者會被作為第一個參數self的實參傳入
self.name就是bob對象的name,name保存在bob對象上,而非Person類上,稱為實例變量
self
self就是調用者,就是c對應的實例對象
self僅為慣例,可以修改為其他名稱,一般不做修改以保證代碼的可讀性
實例變量和類變量
實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法
特殊屬性 |
含義 |
__name__ |
對象名 |
__class__ |
對象的類型 |
__dict__ |
對象的屬性的字典 |
__qualname__ |
類的限定名 |
python中每一種對象都擁有不同的屬性,函數、類都為對象,類的實例也是對象
????????
類屬性保存在類的__dict__中,實例屬性保存在實例的__dict__中,借助__class__找到實例所屬的類可以實現從實例訪問類的屬性
總結
變量是類的,也是這個類所有實例的,其實例都可以訪問到;變量是實例的,通過類無法訪問到
類變量是屬于類的變量,這個類的所有實例可以共享該變量
實例可以動態的為自己增加一個屬性,instance.__dict__[變量名]和instance.變量名都可以訪問到
實例的同名變量會隱藏這個類變量,即覆蓋了該類變量
類變量使用全大寫來命名
實例屬性的查找順序
實例通過.來訪問屬性,會先查找自己的__dict__,若沒有則通過屬性__class__找到自己的類,再到類的__dict__中查找
實例使用__dict__[變量名]訪問變量,則不會查找類中的屬性
類的裝飾
????????
裝飾的本質就是為;類對象動態的添加一個屬性
類方法和靜態方法
普通函數
無參函數在定義時沒有指定self,不能完成實例對象的綁定,無法使用
類方法
????????
在類定義中,使用@classmethod裝飾器裝飾的方法
必須至少一個參數,且第一個參數留給cls,cls指代調用者即類對象自身
cls可為任意其他字符串,不建議修改保證可讀性
通過cls可以直接操作類的屬性
靜態方法
????????
在類定義中,使用@staticmethod裝飾器裝飾的方法
調用時不會隱式傳入諸如self、cls之類的參數
靜態方法,只是表明該方法屬于這個名詞空間,函數放在一起方便組織和管理
方法的調用
類幾乎可以調用內部定義的所有方法,但是調用普通方法時會報錯,原因是必須有self參數
實例幾乎可以調用所有的方法,普通函數的調用一般不使用,不允許該種定義
總結
類除了普通方法都可以調用,普通方法需要對象的實例作為第一個參數
實例可以調用所有類中定義的方法(包括classmethod、staticmethod),普通方法傳入實例自身,靜態方法和類方法需要找到實例的類
訪問控制
私有(private)屬性
使用雙下劃線開頭的屬性名
????????????
外部無法訪問__age
可使用方法來訪問
????????????
私有變量的本質
????????????
類定義的時候,如果使用雙下劃線開頭聲明一個實例變量,Python解釋器會將其改名,轉換為_類名__變量名 的名稱
可是使用私有變量特定格式的名稱從外部訪問私有變量,并修改它
保護變量
在變量名前使用一個下劃線
????????????
并未改變名稱,和普通屬性一樣,解釋器不做任何特殊處理
只是一種約定,提示開發者不要直接使用該變量
私有方法
和保護變量、私有變量一樣使用單下劃線、雙下劃線命名的方法
????????????
本質
單下劃線的方法只是開發者的約定,解釋器不做任何修改
雙下劃線的方法是私有方法,解釋器會改名,_類名__方法名,,保存在類的__dict__中
屬性裝飾器
好的設計:將實例的屬性保護起來,不讓外部直接訪問,外部使用getter和setter讀取或設置屬性
????????
使用property裝飾器時者三個方法同名
property裝飾器:后面跟的函數名就是以后的屬性名,即是getter,這個必須有,有了它至少是只讀屬性
setter裝飾器:與屬性名同名,且接收2個參數,第一個為self,第二個為要賦值的值,有了它,屬性可寫
deleter裝飾器:可以將屬性刪除,很少用
property必須在前,setter、deleter在后
property通過簡單的方式,將對方法的操作變成對屬性的訪問,并起到一定的隱藏效果
原創文章,作者:ZBD20,如若轉載,請注明出處:http://www.www58058.com/97655