1. 程式人生 > >面向對象_Object-Oriented Programing(OOP)

面向對象_Object-Oriented Programing(OOP)

override 即將 類對象 常用 字典 普通 _屬性 何事 間接

面向過程編程
把計算機程序視為一系列的命令集合,即一組函數的順序執行(把大塊函數通過切割成小塊函數來降低系統的復雜度)

面向對象編程 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)