1. 程式人生 > 程式設計 >淺析Python面向物件程式設計

淺析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面向物件程式設計的資料請關注我們其它相關文章!