【Python】学习笔记总结2(Python面向对象)
文章目錄
- 二、Python面向對象
- 1.類(Class)
- 1.1.定義類
- 1.2.類屬性
- 1.3.實例屬性
- 1.3.1.內部添加
- 1.3.2.外部添加
- 1.4.實例方法
- 1.5.類方法
- 1.6.靜態方法
- 1.7.__init__方法(初始化)
- 1.8.Self(當前對象的引用)
- 1.9.魔術方法
- 1.9.1.魔術方法介紹大全
- 2.方法、繼承、多態
- 2.1.析構方法`__del__ `
- 2.1.1.釋放對象時調用
- 2.1.2.手動清空對象
- 2.2.繼承
- 2.2.1.單繼承
- 2.2.2.多繼承
- 2.2.3.重寫父類方法
- 2.2.4.重寫`__init__`方法
- 2.2.4多態
- 2.3類屬性和實例屬性區別
- 2.4類方法和實例方法和靜態方法
- 3.封裝與單例
- 3.1.封裝
- 3.2.單例模式
- 3.3.異常處理
- 3.3.1.異常類型
- 3.3.2.自定義異常類型
- 3.4.動態添加屬性和方法
二、Python面向對象
1.類(Class)
1.1.定義類
class Person :name = '小明'#類屬性age = '20'#類屬性def eat(self):print('吃飯')passpass- 使用
1.2.類屬性
在類的內部,使用def關鍵字定義且有類似(self)的,使用權歸實例所有
name = '小明'#類屬性1.3.實例屬性
1.3.1.內部添加
在方法的內部,使用self引用的屬性
def __init__(self):self.friend = '小紅'1.3.2.外部添加
class People :def eat(self):print(self)passpassxiaoming = People() xiaoming.name = '小明' xiaoming.age = 20 print(xiaoming.name)1.4.實例方法
在類的內部,使用def關鍵字定義且有類似(self)的,使用權歸實例所有
def eat(self):print('吃飯')passpass1.5.類方法
類對象所擁有的方法,用裝飾器@classmethod來標
識其為類方法,對于類方法,第一個參數必須是類對象,
一般以cls作為第- -個參數,
類方法可以通過類對象,實例對象調用
類方法可以訪問、修改類屬性
name = '小明'@classmethoddef findNameInfo(cls):return cls.namepass1.6.靜態方法
靜態方法不需要傳參例如(cls/self)
靜態方法不可以訪問類屬性
通常用類直接訪問靜態方法,本身和類與實例無關
1.7.__init__方法(初始化)
*類似于構造函數,對self的屬性進行構造
自動執行的初始化方法,自帶的內置函數
1.8.Self(當前對象的引用)
實例化后,python解釋器會把當前對象自動傳遞給self
1.9.魔術方法
- __str__
打印時調用的方法
- __new__
創建對象實例的方法,調用一次就會生成新的對象cls(class)cls自動提供
真正創建實例的方法,經常單例模式使用,必須返回實例
- 區別__new __和__init__
- __new __類的實例化方法必須要返回該實例否則對象就創建不成功
- __init__用來做數據屬性的初始化工作也可以認為是實例的構造方法接受類的實例self并對其進行構造
- __new __至少有一個參數是cls代表要實例化的類,此參數在實例化時由python解釋器自動提供
- __new __函數執行要是于__init__函數
1.9.1.魔術方法介紹大全
魔術方法介紹大全
2.方法、繼承、多態
2.1.析構方法__del__
當一個對象被刪除或者被銷毀時,python解釋器也會默認調用一個方法,這個方法為__del__ ()方
法,也稱為析構方法
2.1.1.釋放對象時調用
class People :def __init__(self,name,hp):self.name = nameself.hp = hppassdef __del__(self):print('銷毀了')passpassxiaohong = People('xiaohong',100)2.1.2.手動清空對象
del xiaohong2.2.繼承
2.2.1.單繼承
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def wwj(self):print('汪汪叫')passpass2.2.2.多繼承
class Animal :def eat(self):print('吃')passpassclass God:def fly(self):print('飛')passpassclass Wukong(Animal,God):def Dayaoguai(self):print('打妖怪')passpass- 多繼承,同名方法查找父類,如沒有則向父類的父類查找(廣度優先)
- __mro__方法解析順序,用來了解繼承順序
2.2.3.重寫父類方法
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpass2.2.4.重寫__init__方法
class People :def __init__(self,name,hp):self.name = nameself.hp = hpprint('調用People__init__')passpassclass Man(People):def __init__(self,name,hp):People.__init__(self,name,hp)#調用父類方法1#super().__init__(name,hp)#調用父類方法2,可在父類逐個查找print('調用Man__init__')passpassman = Man('xxx',100)2.2.4多態
繼承并擴展父類代碼,不需要修改父類代碼
class Animal :def eat(self):print('吃')passpassclass Dog(Animal) :def eat(self):print('大口吃')passpassclass Cat(Animal) :def eat(self):print('小口吃')passpassdef commonInvoke(obj) :obj.eat()listObj = [Animal(),Cat(),Dog()]for item in listObj :commonInvoke(item)2.3類屬性和實例屬性區別
實例對象不可以修改類屬性,類屬性所有權歸類所有
2.4類方法和實例方法和靜態方法
1.類方法的第一個參數是類對象cls,通過cls引用的類對象的屬性和方法
2.實例方法的第一個參數是實例對象self,通過self引用的可能是類屬性、也有可能是實例屬
性(這個需要具防分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先
級更高。
3.靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引
用。
3.封裝與單例
3.1.封裝
- 屬性私有化,無法外部訪問,不能被繼承,只能內部類使用
- 方法私有化,無法外部訪問,不能被繼承,只能內部類使用
- 下劃線類型
| _xxx | protected類型(只允許本身和子類訪問) |
| __xxx | private類型(只允許本身訪問) |
| __xxx__ | 魔術方法,Python內置方法 |
| xxx_ | 避免屬性名與python關鍵字沖突 |
-
property(屬性函數)
-
類屬性的方式實現
- 裝飾器方式實現
- __new__實例化方法
3.2.單例模式
不能使用自身new方法,會產生深度遞歸
class Person :__instance = Nonedef __new__(cls, *args, **kwargs):if not hasattr(cls,'_instance') :cls.__instance = super().__new__(cls, *args, **kwargs)return cls.__instancepasspass3.3.異常處理
try#可能出現錯誤的代碼塊 except:#出錯之后執行的代碼塊 else:#沒有出錯的代碼塊 finally:#不管出沒出錯都會執行的代碼塊根據錯誤類型來捕獲的(NameError 、IndexError …)
自上而下依次判斷
3.3.1.異常類型
當前函數沒找到,則向上層一層層傳遞查找
| AssertionError | 當assert語句失敗時引發。 |
| AttributeError | 當 屬性分配或引用失敗時引發。 |
| EOFError | 當input()函數達到文件結束條件時引發。 |
| FloatingPointError | 當浮 點運算失敗時引發。 |
| GeneratorExit | 調用 生成器的close()方法時引發。 |
| ImportError | 找不到導入的模塊時引發。 |
| IndexError | 當序 列的索引超出范圍時引發。 |
| KeyError | 在字典中找不到鍵時引發。 |
| KeyboardInterrupt | 當用戶 按下中斷鍵(Ctrl+c或delete)時引發。 |
| MemoryError | 當操作耗盡內存時引發。 |
| NameError | 在局部或全局范圍內找不到變量時引發。 |
| NotImplementedError | 由抽象方法提出。 |
| OSError | 當系統操作導致系統相關錯誤時引發。 |
| Overf lowError | 當算術運算的結果太大而無法表示時引發。 |
| ReferenceError | 使用弱引用代理訪問垃圾收集的引用時引發。 |
| Runt imeError | 當錯誤不屬于任何其他類別時引發。 |
| StopIteration | 函數引發,以指示迭代器不再返回任何項。 |
| SyntaxError | 遇到語法錯誤時由解析器引發。 |
| Indentat ionError | 當縮進不正確時引發。 |
| TabError | 當縮進由不一致的制表符和空格組成時引發。 |
| SystemError | 當解釋器檢測到內部錯誤時引發。 |
| Sys temExit | 由sys. exit()函數引發。 |
| TypeError | 將函數或操作應用于類型不正確的對象時引發。 |
| UnboundLocalError | 當在函數或方法中引用局部變量,但沒有將值綁定到該變量時引發。 |
| UnicodeError | 當 發生與unicode相關的編碼或解碼錯誤時引發。 |
| UnicodeEncodeError | 當編碼過程中發生與unicode相關的錯誤時引發。 |
| UnicodeDecodeError | 當解碼過程中出現與unicode相關的錯誤時引發。 |
| UnicodeTrans lateError | 翻譯過程中發生與unicode相關的錯誤時引發。 |
| ValueError | 當函數得到類型正確但值不正確的參數時引發。 |
| ZeroDivisionError | 當除法或模運算的第二個操作數為零時引發。 |
3.3.2.自定義異常類型
class LenException(Exception):def __init__(self,leng):self.len = lengpassdef __str__(self):return '長度超了'passdef name_Test():try :name = '1111111111'if len(name)>5:raise LenException(len(name))else:print(name)passpassexcept LenException as msg:print(msg) passname_Test()3.4.動態添加屬性和方法
- 動態添加屬性
- 動態添加實例方法
- 動態添加類方法
- 動態添加靜態方法
- __slots__屬性
來限制該class能添加的屬性。
子類不會繼承,只有在當前類中有效。
子類聲明__slots__屬性才會繼承 - 限制添加的屬性
- __call__屬性
總結
以上是生活随笔為你收集整理的【Python】学习笔记总结2(Python面向对象)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】学习笔记总结1(Pyth
- 下一篇: 【Python】学习笔记总结3(Pyth