概述
很多人接觸Python,都是從爬蟲開始,其實很多語言都可以做爬蟲,只是Python相對其他語言來說,更加簡單而已,但是Python并不止于爬蟲,在人工智能,科學計算等方面的應用更加廣泛,古人云:萬丈高樓平地起,要想有長足的發展,打好基礎很重要,本文主要講解Python的面向物件相關知識,僅供學習分享使用,如有不足之處,還請指正,
面向物件的特征
- 類:用來描述相同事物的特征的集合,如:Person 類,表示人,具有人的屬性和特征,
- 物件:通過類定義的具體的實體,如:zhangsan 表示一個具體的人,
- 繼承:是指派生類繼承基類的方法和屬性,并具有自己屬性和特征,如:Man是Person的子類,
- 封裝:隱藏資料和實作細節,提供對外訪問方法,
- 多型:一個基類,可以有多個派生類,可以有不同的形態,
- 抽象:拋開細節,只關注本質特征的程序,
以上是面向物件的基本特征,那么Python在面向物件方面是如何做的呢?
創建類
如下所示:
- 使用 class 陳述句來創建一個新類,class 之后為類的名稱并以冒號結尾,
- Python的類,沒有大括號表示類的內容范圍,而是通過縮進來實作,
- 類的成員方法和普通方法的區別是,方法定義的第一個引數是self,表示類的實體,但在呼叫時不需要,
- 其中__init__方法為類的初始化方法,當宣告物件時,會呼叫對應的方法,
- 其中__del__方法為解構式,當類被釋放時呼叫,
1 class Employee: 2 """員工類""" 3 emp_count = 0 # 變數是一個類變數,它的值將在這個類的所有實體之間共享 4 5 def __init__(self, name, salary): 6 """初始化""" 7 self.name = name 8 self.salary = salary 9 Employee.emp_count += 1 10 11 def display_count(self): 12 """顯示數量""" 13 print('Total Employee =', Employee.emp_count) 14 15 def display_employee(self): 16 """顯示資訊""" 17 print('name =', self.name, ', salary = ', self.salary) 18 19 def prt(self): 20 """列印自己""" 21 print(self) 22 print(self.__class__) 23 24 def __del__(self): 25 """解構式""" 26 print(self, '被釋放了')
創建物件
Python創建物件,不需要new關鍵字,類似于函式的呼叫,和Java及.Net不同,如下所示:
1 '創建第一個物件' 2 emp = Employee('Jack', 20) 3 emp.display_count() 4 emp.display_employee() 5 emp.prt()
動態添加與洗掉物件屬性
物件的屬性可以動態添加,這點與編譯型語言不同,如下所示:
1 emp.age = 17 # 添加一個 'age' 屬性 2 emp.age = 28 # 修改 'age' 屬性 3 del emp.age # 洗掉 'age' 屬性
也可以通過Python的內置方法來添加和獲取屬性,如下所示:
1 print(getattr(emp, 'name')) # 獲取屬性 2 print(hasattr(emp, 'age')) # 是否包含屬性 3 setattr(emp, 'age', 18) # 設定屬性和值 4 print(hasattr(emp, 'age')) # 是否包含屬性 5 print(getattr(emp, 'age')) # 獲取屬性 6 delattr(emp, 'age') # 洗掉屬性 7 print(hasattr(emp, 'age')) # 是否包含屬性
Python也有內置類的一些屬性,如下所示:
1 # 內置物件 2 print("Employee.__doc__:", Employee.__doc__) 3 print("Employee.__name__:", Employee.__name__) 4 print("Employee.__module__:", Employee.__module__) 5 print("Employee.__bases__:", Employee.__bases__) 6 print("Employee.__dict__:", Employee.__dict__)
類的屬性與方法
- 類的私有屬性,以雙下劃線開頭,只可以在類內部通過self進行訪問,
- 類的protected屬性,以下劃線開頭,只允許子類和自身呼叫,
- 在類的內部,使用 def 關鍵字可以為類定義一個方法,與一般函式定義不同,類方法必須包含引數 self,且為第一個引數
- 類的私有方法:以兩個下劃線開頭,宣告該方法為私有方法,不能在類的外部呼叫,在類的內部呼叫 self.__private_methods
如下所示:
1 class JustCounter: 2 """類描述""" 3 __secretCount = 0 # 類的私有變數 4 publicCount = 0 # 公開變數 5 6 def count(self): 7 self.__secretCount += 1 8 self.publicCount += 1 9 print('私有變數:', self.__secretCount)
Python不允許實體化的類訪問私有資料,但你可以使用 object._className__attrName( 物件名._類名__私有屬性名 )訪問屬性,如下所示:
1 print(counter._JustCounter__secretCount)
類的繼承
面向物件的編程帶來的主要好處之一是代碼的重用,實作這種重用的方法之一是通過繼承機制,通過繼承創建的新類稱為子類或派生類,被繼承的類稱為基類、父類或超類,
- Python中的繼承通過 class 子類名(父類名): 的格式實作,
- 子類可以呼叫父類的方法和定義自己的方法,
- 如果父類方法的功能不能滿足需求,子類可以重寫(overrides)父類的方法,
如下所示:Parent表示一個父類,擁有自己的屬性和方法,
1 class Parent: 2 """定義父類""" 3 parentAttr = 100 4 5 def __init__(self): 6 print('呼叫父類的建構式') 7 8 def parentMethod(self): 9 print('呼叫父類方法') 10 11 def setAttr(self, attr): 12 Parent.parentAttr = attr 13 14 def getAttr(self): 15 print('父類屬性:', Parent.parentAttr) 16 17 def myMethod(self): 18 print('我是父類的MyMethod')
Child表示一個子類,繼承自Parent,如下所示:
1 class Child(Parent): 2 """定義子類""" 3 4 def __init__(self): 5 print('呼叫子類的構造方法') 6 7 def childMethod(self): 8 print('呼叫子類方法') 9 10 def myMethod(self): 11 """重寫Overrides父類方法""" 12 print('我是子類的MyMethod') 13 14 def __str__(self): 15 """重寫方法,適合人閱讀""" 16 return 'str方法回傳'
子類的實體化
如下所示:
1 c = Child() # 實體化子類物件 2 c.childMethod() # 呼叫子類方法 3 c.parentMethod() # 呼叫父類方法 4 c.setAttr(200) # 再次呼叫父類方法,設定屬性 5 c.getAttr() # 再次呼叫父類方法 獲取屬性 6 c.myMethod() # 呼叫的是子類的MyMethod
可以通過內置函式,判斷子類與類的關系,如下所示:
1 print(issubclass(Child, Parent)) # 判斷是否是對應的父子關系 2 print(isinstance(c, Child)) # 判斷是否是實體物件 3 print(isinstance(c, Parent)) # 判斷是否是實體物件
備注
天凈沙·秋思
作者:馬致遠
枯藤老樹昏鴉,小橋流水人家,古道西風瘦馬,夕陽西下,斷腸人在天涯,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137687.html
標籤:Python
