python里面單雙下劃線的區(qū)別詳解
區(qū)別:
- xx:公有變量,所有對象都可以訪問;
- xxx:雙下劃線代表著是系統(tǒng)定義的名字。
- __xxx:雙前置下劃線,避免與子類中的屬性命名沖突,無法在外部直接訪問。代表著類中的私有變量名。
- _xxx:單前置下劃線,私有化屬性和方法,類對象和子類可以訪問。不能用“from module import *”導入。
- xx_:單后置下劃線,用于避免與python關(guān)鍵字的沖突。
Python中存在一些特殊的方法,有些方法以雙下劃線 “__” 開頭和結(jié)尾,它們是Python的魔法函數(shù),比如__init__()和__str__等等。不用要這種方式命名自己的變量或者函數(shù)。
示例代碼:
class Test(object):
def __init__(self, text):
self.text = text
def __str__(self):
return self.text
text = input("Please input text:")
obj = Test(text)
print(obj)
運行結(jié)果:

在前面加上“__”,表示它是私有成員,我們不能直接訪問。比如 “__xxx” 如果要訪問得通過 _class__xxx 的方式進行訪問。雖然不能防止修改私有屬性,但可以有效降低有意或者無意的修改。
示例代碼:
class Test(object):
def __init__(self, text):
self.__text = text
self.__text2 = text
def func(self):
print(self.__text)
def __str__(self):
return self.__text
text = input("Please input text:")
obj = Test(text)
print(obj)
obj.func()
# print(obj.__text) # 報錯
print(obj._Test__text)
print(dir(obj))
運行效果:

從圖中可以看到雙下劃線開頭的變量,Python自動在前面加上了 “_class” 的前綴,所以我們訪問時也要加上相應的前綴才能正常訪問。
_xxx:一種約定,用來指定變量私有。程序員用來指定私有變量的一種方式。不能用from module import * 導入,其他方面和公有一樣訪問。
示例代碼:
# test.py
class Test1(object):
def __init__(self):
self.text = "my is text!"
def __str__(self):
return self.text
class _Test2(object):
def __init__(self):
self.text = "my is text2!"
def __str__(self):
return self.text
if __name__ == '__main__':
obj1 = Test1()
obj2 = _Test2()
print(obj1)
print(obj2)

可以通過別的方式訪問這個類,修改我們的test2.py文件為以下內(nèi)容。
# test2.py import test obj1 = test.Test1() print(obj1) obj2 = test._Test2() print(obj2)
除了不能通過 from module import * 這種方式導入外,跟公有類并沒有差別。
運行效果:

__sizeof__() : 打印系統(tǒng)分配空間的大小。
示例代碼:
class Test(object):
def __init__(self):
self.__text = "my is text!"
def func(self):
print(self.__text)
def __str__(self):
return self.__text
obj = Test()
print(obj)
print(dir(obj))
print("*" * 100)
print(obj.func.__sizeof__())
print(obj.func.__sizeof__)
print("*" * 100)
print(obj.func().__sizeof__)
print(obj.func().__sizeof__())
運行結(jié)果:
、

__name__:前面和后面加上下劃線代表著是系統(tǒng)定義的名字。普通變量不能使用此方式來命名。__name_表示當前模塊執(zhí)行過程中的名稱,如果該模塊執(zhí)行,則__name__的值為__main_,如果模塊是被導入的,則__name__的值為被導入的模塊的模塊名字。
__main__:表示整個工程開始運行的入口。
示例代碼:
# test_name.py
def func():
if __name__ == '__main__':
print("my name is %s" % __name__) # my name is __main__
else:
print("It's me: %s" % __name__) # It's me: test_name
if __name__ == '__main__':
func() # my name is __main__
# 在其它文件中
# test_name2.py
import test_name
test_name.func() # It's me: test_name
到此這篇關(guān)于python里面單雙下劃線的區(qū)別詳解的文章就介紹到這了,更多相關(guān)python 單雙下劃線區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python設(shè)計模式編程中解釋器模式的簡單程序示例分享
這篇文章主要介紹了Python設(shè)計模式編程中解釋器模式的簡單程序示例分享,解釋器模式強調(diào)用抽象類來表達程序中將要實現(xiàn)的功能,需要的朋友可以參考下2016-03-03
python3 pathlib庫Path類方法總結(jié)
這篇文章主要介紹了python3 pathlib庫Path類方法總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
對Python中創(chuàng)建進程的兩種方式以及進程池詳解
今天小編就為大家分享一篇對Python中創(chuàng)建進程的兩種方式以及進程池詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
python基礎(chǔ)學習之生成器與文件系統(tǒng)知識總結(jié)
本文是參考《python數(shù)據(jù)分析》的附錄對生成器和文件系統(tǒng)結(jié)合案例的一個簡單回顧,文中對python生成器與文件系統(tǒng)作了非常詳細的介紹,對正在學習python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
詳解Python3.8+PyQt5+pyqt5-tools+Pycharm配置詳細教程
這篇文章主要介紹了Python3.8+PyQt5+pyqt5-tools+Pycharm配置詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-11-11
python GUI庫圖形界面開發(fā)之PyQt5打開保存對話框QFileDialog詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5打開保存對話框QFileDialog詳細使用方法與實例,需要的朋友可以參考下2020-02-02

