python中 _、__、__xx__()區(qū)別及使用場景
理論
- Python中不存在真正的私有方法。為了實現(xiàn)類似于c++中私有方法,可以在類的方法或屬性前加一個“_”單下劃線,意味著該方法或屬性不應該去調用,它并不屬于API。但是,這只是一個形式上的約定,python并不阻止調用。
- __雙下劃線的作用是避免覆蓋其內容,實現(xiàn)的機制是在帶有雙下劃線的方法或屬性前加上_類名的標識。由于,python自動對方法和屬性進行了改寫,所以直接調用帶有雙下劃線的方法是調用不到的。
- “xx”經(jīng)常是操作符或本地函數(shù)調用的magic methods。在上面的例子中,提供了一種重寫類的操作符的功能。它是用于Python調用的。
1、訪問權限(private、public)與繼承方式(只有public繼承)
在面向對象編程語言中,類的屬性與方法都會設置訪問控制權限,從而滿足我們的設計需求。一般而言,我們通常會將對象的屬性設置為私有的(private)或受保護的(protected),簡單的說就是不允許外界訪問,而對象的方法通常都是公開的(public),因為公開的方法就是對象向外界提供的接口。 在Python中,屬性和方法的訪問權限只有兩種,也就是公開的和私有的,如果希望屬性是私有的,在給屬性命名時可以用 兩個下劃線作 為開頭, 下面的代碼可以驗證這一點。
class Test:
def __init__(self, foo):
self.__foo = foo # 私有屬性
# 定義私有函數(shù),外界不可以直接訪問,但是可以通過【_類名__函數(shù)名】去調用私有函數(shù)
def __bar(self):
print(self.__foo)
print('__bar')
def main():
"""
test = Test('hello')
# AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
"""
# 使用以下這種方式就可以在類的外部調用類的私有屬性與方法
test._Test__bar()
print(test._Test__foo)
if __name__ == "__main__":
main()
在實際開發(fā)中,我們并不建議將屬性設置為私有的,因為這會導致子類無法訪問。所以大多數(shù)Python程序員會 遵循一種命名慣例,就是讓屬性名以 單下劃線 開頭來表示屬性是受保護的 ,本類之外的代碼在訪問這樣的屬性時應該要保持慎重。這種做法并不是語法上的規(guī)則,單下劃線開頭的屬性和方法外界仍然是可以訪問的,所以更多的時候它是一種暗示或隱喻,讓調用者知道這是不應該直接訪問的屬性或方法,而且這樣做并不影響子類去繼承這些東西。
2、__xx__() 的使用
- 在python中,方法名如果是__xx__()的話,那么就有特殊的功能,因此叫做“魔法”方法;
- 當使用print輸出對象的時候,只要自己定義了__str__(self)方法,那么就會打印從在這個方法中return的數(shù)據(jù);
- __str__()方法需要返回一個字符串,當做這個對象的描寫。
案例:定義一個類描述數(shù)字時鐘
import time
class Clock(object):
"""數(shù)字時鐘"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 時
:param minute: 分
:param second: 秒
"""
self._hour = hour
self._minute = minute
self._second = second
def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def __str__(self):
"""顯示時間"""
return '%02d:%02d:%02d' %(self._hour, self._minute, self._second)
def main():
clock = Clock(23, 59, 58)
while True:
print(clock)
time.sleep(1)
clock.run()
if __name__ == '__main__':
main()
注意:Python類中的那些魔法方法,如__str__、__repr__等,這些方法并不是私有成員哦,雖然它們以雙下劃線開頭,但是他們也是以雙下劃線結尾的,這種命名并不是私有成員的命名,
到此這篇關于python中 _、__、__xx__()區(qū)別及使用場景的文章就介紹到這了,更多相關python _、__、__xx__() 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python數(shù)據(jù)可視化JupyterLab實用擴展程序Mito
這篇文章主要為大家介紹了python數(shù)據(jù)可視化JupyterLab實用擴展程序Mito的功能應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
python 解決動態(tài)的定義變量名,并給其賦值的方法(大數(shù)據(jù)處理)
今天小編就為大家分享一篇python 解決動態(tài)的定義變量名,并給其賦值的方法(大數(shù)據(jù)處理),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
在python中利用最小二乘擬合二次拋物線函數(shù)的方法
今天小編就為大家分享一篇在python中利用最小二乘擬合二次拋物線函數(shù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12

