程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python學習6

編輯:Python

目錄

面向對象程序設計

私有成員與公有成員

方法

屬性

常用特殊方法

繼承機制


面向對象程序設計

私有成員與公有成員

Python並沒有對私有成員提供嚴格的訪問保護機制。

在定義類的成員時,如果成員名以兩個下劃線“__”或更多下劃線開頭而不以兩個或更多下劃線結束則表示是私有成員

私有成員在類的外部不能直接訪問,需要通過調用對象的公開成員方法來訪問,也可以通過Python支持的特殊方式來訪問。

公開成員既可以在類的內部進行訪問,也可以在外部程序中使用。 

在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。

_xxx:受保護成員,不能用'from module import *'導入;

__xxx__:系統定義的特殊成員;

__xxx:私有成員,只有類對象自己能訪問,子類對象不能直接訪問到這個成員,但在對象外部可以通過“對象名._類名__xxx”這樣的特殊方式來訪問。

注意:Python中不存在嚴格意義上的私有成員。 

在IDLE交互模式下,一個下劃線“_”表示解釋器中最後一次顯示的內容或最後一次語句正確執行的輸出結果。

>>> 3 + 5
8
>>> 8 + 2
10
>>> _ * 3
30
>>> _ / 5
6.0
>>> 1 / 0
ZeroDivisionError: integer division or modulo by zero
>>> _
6.0

在程序中,可以使用一個下劃線來表示不關心該變量的值。

>>> for _ in range(5):
print(3, end=' ')
3 3 3 3 3
>>> a, _ = divmod(60, 18) #只關心整商,不關心余數,
#等價於a = 60//18
>>> a
3

方法

在類中定義的方法可以粗略分為四大類:公有方法、私有方法、靜態方法和類方法。

私有方法的名字以兩個下劃線“__”開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬於類和對象的成員;

公有方法通過對象名直接調用,私有方法不能通過對象名直接調用,只能在屬於對象的方法中通過self調用或在外部通過Python支持的特殊方式來調用。

如果通過類名來調用屬於對象的公有方法,需要顯式為該方法的self參數傳遞一個對象名,用來明確指定訪問哪個對象的數據成員。

靜態方法類方法都可以通過類名和對象名調用,但不能直接訪問屬於對象的成員,只能訪問屬於類的成員。

靜態方法可以沒有參數。

一般將cls作為類方法的第一個參數名稱,但也可以使用其他的名字作為參數,並且在調用類方法時不需要為該參數傳遞值。

>>> class Root:
__total = 0
def __init__(self, v): #構造方法
self.__value = v
Root.__total += 1
def show(self): #普通實例方法
print('self.__value:', self.__value)
print('Root.__total:', Root.__total)
@classmethod #修飾器,聲明類方法
def classShowTotal(cls): #類方法
print(cls.__total)
@staticmethod #修飾器,聲明靜態方法
def staticShowTotal(): #靜態方法
print(Root.__total)
>>> r = Root(3)
>>> r.classShowTotal() #通過對象來調用類方法
1
>>> r.staticShowTotal() #通過對象來調用靜態方法
1
>>> r.show()
self.__value: 3
Root.__total: 1
>>> rr = Root(5)
>>> Root.classShowTotal() #通過類名調用類方法
2
>>> Root.staticShowTotal() #通過類名調用靜態方法
2
>>> Root.show() #試圖通過類名直接調用實例方法,失敗
TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r) #但是可以通過這種方法來調用方法並訪問實例成員
self.__value: 3
Root.__total: 2
>>> Root.show(rr) #通過類名調用實例方法時為self參數顯式傳遞對象名
self.__value: 5
Root.__total: 2

屬性

只讀屬性 

只讀屬性
>>> class Test:
def __init__(self, value):
self.__value = value
@property
def value(self): #只讀,無法修改和刪除
return self.__value
>>> t = Test(3)
>>> t.value
3
>>> t.value = 5 #只讀屬性不允許修改值
AttributeError: can't set attribute
>>> t.v=5 #動態增加新成員
>>> t.v
5
>>> del t.v #動態刪除成員
>>> del t.value #試圖刪除對象屬性,失敗
AttributeError: can't delete attribute
>>> t.value
3

常用特殊方法

Python類有大量的特殊方法,其中比較常見的是構造函數析構函數,除此之外,Python還支持大量的特殊方法,運算符重載就是通過重寫特殊方法實現的

Python中類的構造函數是__init__(),一般用來為數據成員設置初值或進行其他必要的初始化工作,在創建對象時被自動調用和執行。如果用戶沒有設計構造函數,Python將提供一個默認的構造函數用來進行必要的初始化工作。

Python中類的析構函數是__del__(),一般用來釋放對象占用的資源,在Python刪除對象和收回對象空間時被自動調用和執行。如果用戶沒有編寫析構函數,Python將提供一個默認的析構函數進行必要的清理工作。

繼承機制

在繼承關系中,已有的、設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。如果需要在派生類中調用基類的方法,可以使用內置函數super()或者通過“基類名.方法名()”的方式來實現這一目的。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved