面向對象_Object-Oriented Programing(OOP)
面向過程編程
把計算機程序視為一系列的命令集合,即一組函數的順序執行(把大塊函數通過切割成小塊函數來降低系統的復雜度)
面向對象編程 Object-Oriented Programing OOP
把計算機程序視為一組對象的集合,而每個對象都可以接收其他對象發過來的消息並處理消息
計算機程序的執行就是一系列消息在各個對象之間傳遞
什麽是對象:
對象是指現實中的物體或實體
對象的特征:
1.對象有很多屬性(名詞或形容詞)
年齡,姓名,性別
2.對象有很多行為(動作,動詞)
學習,吃飯,睡覺,踢球,工作
什麽是面向對象:
把一切看成對象(實例),用各種對象之間的關系來描述事務
重要概念:類(class)和實例(Instance),類是抽象的模板,比如Student類,而實例是
根據類創建出來的一個個具體的‘對象‘,每個對象都擁有相同的方法,但各自的數據可能不同
面向對象的三大特點:
封裝、繼承、多態
什麽是類:
1.擁有相同屬性和行為的對象分為一組,即是一個類
2.類是用來描述對象的工具,用類可以創建此類的對象(實例)
3.類就是一種定義新種類的東西的方式,它反映了在程序領域中的真實對象
類的創建語句 class語句
語法:
class 類名(繼承列表(object)): #類名通常是大寫開頭的單詞,(繼承列表(object)表示該類從那個類繼承下來的)
‘‘‘類文檔字符串‘‘‘
類的__slots__列表
實例方法定義
類變量定義
類方法定義(@classmethod)
靜態方法定義(@staticmethod)
作用:
創建一個類
類用於描述對象的行為和屬性
類用於創建此類的一個或多個對象(實例)
說明:
類名必須為標誌符(與變量名命名規則相同,建議首字母大寫)
類名實質上就是變量,它綁定一個類
類的文檔字符串:
類內第一個沒有賦值給任何變量的字符串為類的文檔字符串
類的文檔字符串可以通過help()函數來查看
類的文檔字符串綁定在類的__doc__屬性上
類的__slots__列表
作用:
限定一個類創建的實例只能有固定的屬性(實例變量)
不允許對象添加列表以外的實例屬性(實例變量)
防止用於因錯誤寫屬性名而發生程序錯誤
說明:
__slots__屬性綁定一個字符串列表
含有__slots__屬性的類所創建的實例對象沒有__dict__屬性
即此實例不用字典來存儲對象的實例屬性
示例:見
初始化方法__init__():
作用:
對新創建的對象添加屬性
語法格式:
class 類名(繼承列表)
def init(self,[形參列表]): #第一個參數永遠是self,表示創建的實例本身
語句塊
註:[]代表其中的內容可以省略
說明:
1.初始化方法名必須為 ‘init‘ 不可改變
2.初始化方法會在構造函數創建實例後自動調用,
3.在創建實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,
但self不需要傳,Python解釋器自己會把實例變量傳進去
(即實例自身通過參數self傳入__init__方法(每個與類相關聯的方法調用都自動傳遞實參self,
它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法))
3.構造函數的實參將通過
__init__方法的參數列表傳入到 __init__方法中
4.初始化方法內如果需要return 語句返回,則只能返回None
析構方法:
class 類名(繼承列表):
def del(self):
語句塊
析構方法在對象被銷毀時被自動調用
python語言建議不要在對象銷毀時做任何事情,因為銷毀時間難以確定
實例方法(method)
語法:
class 類名(繼承列表):
def 實例方法名(self,形參名,形參名2,...):
‘方法文檔字符串‘
語句塊
作用:
用於描述一個對象的行為,讓此類型的全部對象都擁有相同的行為
說明:
實例方法的實質是函數,是定義在類內的函數
實例方法至少有一個形參,第一個形參用來綁定調用這個方法的實例,
一般命名為‘self‘
實例方法的調用語句:
實例.實例方法(調用傳參)
#或
類名.實例方法名(實例,調用傳參)
實例屬性 attrribute(也叫實例變量)
每個實例可以有自己的變量用來保存對象自己的數據,稱為實例變量(也叫屬性)
語法:
實例.屬性名
賦值規則同變量的賦值規則
首次為屬性賦值則創建此屬性
再次屬性賦值則改變屬性的綁定關系
作用:
記錄每個對象自身的數據
構造函數:
構造函數調用表達式:
類名([創建傳參列表])
作用:
創建這個類的實例對象,並返回此實例對象的引用關系
說明:
實例有自己的作用域和名字空間,可以為該實例添加實例變量(也叫屬性)
實例可以調用類方法和實例方法
實例可以訪問類變量和實例變量
類變量:
類變量是類的屬性,此屬性屬於類,不屬於此類的實例
作用:
通常用來存儲該類創建對象的共有屬性
說明:
類變量可以通過該類直接訪問
類變量可以通過類的實例直接訪問
類變量可以通過此類的對象的__class__屬性間接訪問
示例:見
類方法 @classmethod
類方法是用於描述類的行為的方法,類方法屬於類,不屬於類的實例對象
說明:
1.類方法需要使用@classmethod裝飾器定義
2.類方法至少有一個形參,第一個形參用於綁定類,約定寫為‘cls‘
3.類和該類的實例都可以調用類方法
4.類方法不能訪問此類創建的對象的實例屬性
靜態方法 @staticmethod
靜態方法是定義在類的內部的函數,此函數的作用域是類的內部
說明:
靜態方法需要使用@staticmethod裝飾器來定義
靜態方法與普通函數定義相同,不需要傳入self實例參數和cls類參數
靜態方法只能憑借該類或類創建的實例調用
靜態方法不能訪問類變量和實例變量
示例:見
del 語句:
可以刪除對象(實例)的屬性
語法:
del 對象.實例變量名
示例:
class Dog:
pass
dog1 = Dog()
dog1.color = ‘白色‘
del dog1.color
print(dog1.color) AttributeError錯誤
del小結:
1.刪除變量 del name
2.刪除列表的元素 del L[1] / del L[::2]
3.刪除字典的鍵 del d[‘name‘]
4.刪除對象的屬性 del dog1.color
預置實例屬性
__dict__屬性
__dict__屬性綁定一個存儲此實例自身變量字典
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__dict__) #{}
dog1.color = ‘白色‘
print(dog1.__dict__) #{‘color‘:‘白色‘}
dog1.kinds = ‘京巴‘
print(dog1.__dict__) #{‘color‘:‘白色‘,‘kinds‘:‘京巴‘}
__class__屬性
‘__class__‘ 屬性綁定創建此實例的類
作用:
可以借助此屬性來訪問創建此實例的類
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__class__) #
dog2 = dog1.__class__()
print(dog2.__class__)
用於類的函數:(isinstance/type)
isinstance(obj,class_or_tuple)
返回這個對象obj是否是某個類的對象或者某些類中的一個類的對象,
如果是則返回True,否則返回False
type(obj) 返回對象的類型
繼承 inheritance 和 派生 deriverd:
什麽是繼承/派生?
繼承是從已有的類中派生出新的類,新類具有原類的數據屬性和行為
,並能擴展新的行為
派生類就是從一個已有的類中衍生出新的類,在新類的基礎上添加新的屬性和行為
為什麽繼承/派生
繼承的目的是延續舊類的功能
派生的目的是在舊類的基礎上改變原有的功能
名詞:
基類(base class)/超類(super class)/父類(father class)
派生類(deriverd class)/子類(child class)
繼承派生機制的作用:
1.可以將一些共有功能加在基類中,實現代碼共享
2. 在不改變基類的基礎上改變原有功能
單繼承:
語法:
class 類名(基類名):
語句塊
說明:
單繼承是指派生類由一個基類衍生出來的新類
示例見:
繼承說明:
python3任何類都直接或間接的繼承自object類
object類是一切類的超類
類的__base__屬性
__base__屬性用來記錄此類的基類
python內建的類見:
help(__builtins__)
覆蓋 override (也叫重寫父類方法)
什麽是覆蓋?
覆蓋是指在有繼承關系的類中,子類中實現了與基類
同名的方法,在子類的實例調用該方法時,實際調用
的是子類中的覆蓋版本,這種現象叫覆蓋
示例見:
問題:當覆蓋發生時,子類對象如何調用父類中的覆蓋方法?
調用方式:
基類名.方法名(實例,實際調用傳參)
super函數:
super(cls,obj) 返回綁定超類的實例(要求obj必須為cls類型的實例)
super() 返回綁定超類的實例,等同於:super(__class__,
實例方法的第一個參數,必須在方法內調用)
作用:
借助super()返回實例間接調用父類的覆蓋方法
顯示調用基類的初始化方法:
當子類中實現了__init__()方法,基類的構造方法並不會被調用,此時需要顯示調用
示例見:
類編碼風格
1.你必須熟悉有些與類相關的編碼風格問題,在你編寫的程序較復雜時尤其如此。
2.類名應采用駝峰命名法 ,即將類名中的每個單詞的首字母都大寫,而不使用下劃線。實例名和模塊名都采用小寫格式,並在單詞之間加上下劃
線。
3.對於每個類,都應緊跟在類定義後面包含一個文檔字符串。這種文檔字符串簡要地描述類的功能,並遵循編寫函數的文檔字符串時采用的格式約
定。每個模塊也都應包含一個文檔字符串,對其中的類可用於做什麽進行描述。
4.可使用空行來組織代碼,但不要濫用。在類中,可使用一個空行來分隔方法;而在模塊中,可使用兩個空行來分隔類。
5.需要同時導入標準庫中的模塊和你編寫的模塊時,先編寫導入標準庫模塊的import 語句,再添加一個空行,然後編寫導入你自己編寫的模塊的
import 語句。在包含多條import 語句的程序中,這種做法讓人更容易明白程序使用的各個模塊都來自何方。
面向對象_Object-Oriented Programing(OOP)