Python語法—物件

是皮皮攀呀,發表於2019-02-28

Python語法—物件

物件導向

Python從設計之初就已經是一門物件導向的語言,正因為如此,在Python中建立一個類和物件是很容易的。本章節我們將詳細介紹Python的物件導向程式設計。

如果你以前沒有接觸過物件導向的程式語言,那你可能需要先了解一些面嚮物件語言的一些基本特徵,在頭腦裡形成一個基本的物件導向的概念,這樣有助於你更容易的學習Python的物件導向程式設計。

接下來我們先來簡單的瞭解下物件導向的一些基本特徵。

  • 類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法物件是類的例項
  • 類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用
  • 資料成員:類變數或者例項變數用於處理類及其例項物件的相關的資料。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
  • 例項變數:定義在方法中的變數,只作用於當前例項的類。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基類物件對待。例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。
  • 例項化:建立一個類的例項,類的具體物件。
  • 方法:類中定義的函式。
  • 物件:通過類定義的資料結構例項。物件包括兩個資料成員(類變數和例項變數)和方法

建立類

使用class語句來建立一個新類,class之後為類的名稱並以冒號結尾,如下例項:

class ClassName:
‘類的幫助資訊’ #類文件字串
class_suite #類體

以下是一個簡單的Python類例項:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

建立例項物件

例項化類其他程式語言中一般用關鍵字 new,但是在 Python 中並沒有這個關鍵字,類的例項化類似函式呼叫方式

以下使用類的名稱 Employee 來例項化,並通過 init 方法接受引數。

“建立 Employee 類的第一個物件”
emp1 = Employee(“Zara”, 2000)
“建立 Employee 類的第二個物件”
emp2 = Employee(“Manni”, 5000)


內建類屬性

__dict__ : 類的屬性(包含一個字典,由類的資料屬性組成)
__doc__ :類的文件字串
__name__: 類名
__module__: 類定義所在的模組(類的全名是'__main__.className',如果類位於一個匯入模組mymod中,那麼className.__module__ 等於 mymod)
__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)

Python內建類屬性呼叫例項如下:


#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
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__

類的繼承

物件導向的程式設計帶來的主要好處之一是程式碼的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的型別和子型別關係。

需要注意的地方:繼承語法 class 派生類名(基類名)://… 基類名寫在括號裡,基本類是在類定義的時候,在元組之中指明的。

在python中繼承中的一些特點:

1:在繼承中基類的構造(__init__()方法)不會被自動呼叫,它需要在其派生類的構造中親自專門呼叫。
2:在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上self引數變數。區別於在類中呼叫普通函式時並不需要帶上self引數
3:Python總是首先查詢對應型別的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查詢。(先在本類中查詢呼叫的方法,找不到才去基類中找)。

如果在繼承元組中列了一個以上的類,那麼它就被稱作"多重繼承" 。

派生類的宣告,與他們的父類類似,繼承的基類列表跟在類名之後,如下所示:

class SubClassName (ParentClass1[, ParentClass2, …]):
‘Optional class documentation string’
class_suite


#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
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
 
class Child(Parent): # 定義子類
   def __init__(self):
      print "呼叫子類構造方法"
 
   def childMethod(self):
      print '呼叫子類方法'
 
c = Child()          # 例項化子類
c.childMethod()      # 呼叫子類的方法
c.parentMethod()     # 呼叫父類方法
c.setAttr(200)       # 再次呼叫父類的方法 - 設定屬性值
c.getAttr()          # 再次呼叫父類的方法 - 獲取屬性值

你可以使用issubclass()或者isinstance()方法來檢測。

  • issubclass() - 布林函式判斷一個類是另一個類的子類或者子孫類,語法:issubclass(sub,sup)
  • isinstance(obj, Class) 布林函式如果obj是Class類的例項物件或者是一個Class子類的例項物件則返回true。

方法重寫

如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法:

例項:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Parent:        # 定義父類
   def myMethod(self):
      print '呼叫父類方法'
 
class Child(Parent): # 定義子類
   def myMethod(self):
      print '呼叫子類方法'
 
c = Child()          # 子類例項
c.myMethod()         # 子類呼叫重寫方法

單下劃線、雙下劃線、頭尾雙下劃線說明:

__foo__: 定義的是特列方法,類似 __init__() 之類的。

_foo: 以單下劃線開頭的表示的是 protected 型別的變數,即保護型別只能允許其本身與子類進行訪問,不能用於 from module import *

__foo: 雙下劃線的表示的是私有型別(private)的變數, 只能是允許這個類本身進行訪問了。

#以上內容整理自summercamp中的學習資料

相關文章