淺析Python面向物件程式設計
概述
很多人接觸Python,都是從爬蟲開始,其實很多語言都可以做爬蟲,只是Python相對其他語言來說,更加簡單而已。但是Python並不止於爬蟲,在人工智慧,科學計算等方面的應用更加廣泛。古人云:萬丈高樓平地起,要想有長足的發展,打好基礎很重要,本文主要講解Python的面向物件相關知識,僅供學習分享使用,如有不足之處,還請指正。
面向物件的特徵
類:用來描述相同事物的特徵的集合,如:Person 類,表示人,具有人的屬性和特徵。
物件:通過類定義的具體的例項,如:zhangsan 表示一個具體的人。
繼承:是指派生類繼承基類的方法和屬性,並具有自己屬性和特徵,如:Man是Person的子類。
多型:一個基類,可以有多個派生類,可以有不同的形態。
抽象:拋開細節,只關注本質特徵的過程。
以上是面向物件的基本特徵,那麼Python在面向物件方面是如何做的呢?
建立類
如下所示:
- 使用 class 語句來建立一個新類,class 之後為類的名稱並以冒號結尾。
- Python的類,沒有大括號表示類的內容範圍,而是通過縮排來實現。
- 類的成員方法和普通方法的區別是,方法定義的第一個引數是self,表示類的例項,但在呼叫時不需要。
- 其中__init__方法為類的初始化方法,當宣告物件時,會呼叫對應的方法。
- 其中__del__方法為解構函式,當類被釋放時呼叫。
class Employee: """員工類""" emp_count = 0 # 變數是一個類變數,它的值將在這個類的所有例項之間共享 def __init__(self,name,salary): """初始化""" self.name = name self.salary = salary Employee.emp_count += 1 def display_count(self): """顯示數量""" print('Total Employee =',Employee.emp_count) def display_employee(self): """顯示資訊""" print('name =',self.name,',salary = ',self.salary) def prt(self): """列印自己""" print(self) print(self.__class__) def __del__(self): """解構函式""" print(self,'被釋放了')
建立物件
Python建立物件,不需要new關鍵字,類似於函式的呼叫,和Java及.Net不同。如下所示:
'建立第一個物件' emp = Employee('Jack',20) emp.display_count() emp.display_employee() emp.prt()
動態新增與刪除物件屬性
物件的屬性可以動態新增,這點與編譯型語言不同,如下所示:
emp.age = 17 # 新增一個 'age' 屬性 emp.age = 28 # 修改 'age' 屬性 del emp.age # 刪除 'age' 屬性
也可以通過Python的內建方法來新增和獲取屬性,如下所示:
print(getattr(emp,'name')) # 獲取屬性 print(hasattr(emp,'age')) # 是否包含屬性 setattr(emp,'age',18) # 設定屬性和值 print(hasattr(emp,'age')) # 是否包含屬性 print(getattr(emp,'age')) # 獲取屬性 delattr(emp,'age') # 刪除屬性 print(hasattr(emp,'age')) # 是否包含屬性
Python也有內建類的一些屬性,如下所示:
# 內建物件 print("Employee.__doc__:",Employee.__doc__) print("Employee.__name__:",Employee.__name__) print("Employee.__module__:",Employee.__module__) print("Employee.__bases__:",Employee.__bases__) print("Employee.__dict__:",Employee.__dict__)
類的屬性與方法
- 類的私有屬性,以雙下劃線開頭,只可以在類內部通過self進行訪問。
- 類的protected屬性,以下劃線開頭,只允許子類和自身呼叫。
- 在類的內部,使用 def 關鍵字可以為類定義一個方法,與一般函式定義不同,類方法必須包含引數 self,且為第一個引數
- 類的私有方法:以兩個下劃線開頭,宣告該方法為私有方法,不能在類的外部呼叫。在類的內部呼叫 self.__private_methods
如下所示:
class JustCounter: """類描述""" __secretCount = 0 # 類的私有變數 publicCount = 0 # 公開變數 def count(self): self.__secretCount += 1 self.publicCount += 1 print('私有變數:',self.__secretCount)
Python不允許例項化的類訪問私有資料,但你可以使用 object._className__attrName( 物件名._類名__私有屬性名 )訪問屬性,如下所示:
print(counter._JustCounter__secretCount)
類的繼承
面向物件的程式設計帶來的主要好處之一是程式碼的重用,實現這種重用的方法之一是通過繼承機制。通過繼承建立的新類稱為子類或派生類,被繼承的類稱為基類、父類或超類。
- Python中的繼承通過 class 子類名(父類名): 的格式實現。
- 子類可以呼叫父類的方法和定義自己的方法。
- 如果父類方法的功能不能滿足需求,子類可以重寫(overrides)父類的方法。
如下所示:Parent表示一個父類,擁有自己的屬性和方法。
class Parent: """定義父類""" parentAttr = 100 def __init__(self): print('呼叫父類的建構函式') def parentMethod(self): print('呼叫父類方法') def setAttr(self,attr): Parent.parentAttr = attr def getAttr(self): print('父類屬性:',Parent.parentAttr) def myMethod(self): print('我是父類的MyMethod')
Child表示一個子類,繼承自Parent,如下所示:
class Child(Parent): """定義子類""" def __init__(self): print('呼叫子類的構造方法') def childMethod(self): print('呼叫子類方法') def myMethod(self): """重寫Overrides父類方法""" print('我是子類的MyMethod') def __str__(self): """重寫方法,適合人閱讀""" return 'str方法返回'
子類的例項化
如下所示:
c = Child() # 例項化子類物件 c.childMethod() # 呼叫子類方法 c.parentMethod() # 呼叫父類方法 c.setAttr(200) # 再次呼叫父類方法,設定屬性 c.getAttr() # 再次呼叫父類方法 獲取屬性 c.myMethod() # 呼叫的是子類的MyMethod
可以通過內建函式,判斷子類與類的關係,如下所示:
print(issubclass(Child,Parent)) # 判斷是否是對應的父子關係 print(isinstance(c,Child)) # 判斷是否是例項物件 print(isinstance(c,Parent)) # 判斷是否是例項物件
以上就是淺析Python面向物件程式設計的詳細內容,更多關於Python面向物件程式設計的資料請關注我們其它相關文章!