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

python learning 6

編輯:Python

目錄

面向對象程序設計

私有成員與公有成員

方法

屬性

Commonly used special methods

繼承機制


面向對象程序設計

私有成員與公有成員

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

在定義類的成員時,如果成員名以兩個下劃線“__”or more underscores and not ending with two or more underscores indicates a private member.

私有成員在類的外部不能直接訪問,It needs to be accessed by calling a public member method of the object,也可以通過Python支持的特殊方式來訪問.

Public members can be accessed both within the class,也可以在外部程序中使用. 

在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

在程序中,You can use an underscore to indicate that you don't care about the value of the variable.

>>> for _ in range(5):
print(3, end=' ')
3 3 3 3 3
>>> a, _ = divmod(60, 18) #Only care about the whole business,Don't care about remainder,
#等價於a = 60//18
>>> a
3

方法

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

私有方法The name begins with two underscores“__”開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬於類和對象的成員;

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

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

靜態方法類方法Both can be called by class name and object name,但不能直接訪問屬於對象的成員,只能訪問屬於類的成員.

靜態方法可以沒有參數.

一般將cls作為類方法的第一個參數名稱,But other names can also be used as parameters,And you don't need to pass a value for that parameter when calling the class method.

>>> 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() #Attempt to call instance method directly by class name,失敗
TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r) #But it is possible to call methods and access instance members this way
self.__value: 3
Root.__total: 2
>>> Root.show(rr) #When an instance method is invoked by the class nameselfThe parameter explicitly passes the object name
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 #Dynamically add new members
>>> t.v
5
>>> del t.v #Dynamically delete members
>>> del t.value #Attempt to delete object property,失敗
AttributeError: can't delete attribute
>>> t.value
3

Commonly used special methods

Python類有大量的特殊方法,其中比較常見的是構造函數析構函數,除此之外,PythonA large number of special methods are also supported,Operator overloading is achieved by overriding special methods.

PythonThe constructor of the class in is __init__(),It is generally used to set initial values ​​for data members or perform other necessary initialization work,Called and executed automatically when the object is created.If the user does not design the constructor,PythonA default constructor will be provided to perform the necessary initialization.

Python中類的析構函數是__del__(),一般用來釋放對象占用的資源,在PythonCalled and executed automatically when objects are deleted and object space is reclaimed.如果用戶沒有編寫析構函數,PythonA default destructor will be provided to do the necessary cleanup.

繼承機制

在繼承關系中,已有的、設計好的類稱為父類或基類,新設計的類稱為子類或派生類.派生類可以繼承父類的公有成員,但是不能繼承其私有成員.If you need to call a method of the base class in the derived class,可以使用內置函數super()或者通過“基類名.方法名()”way to achieve this.


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