1. 程式人生 > 其它 >python - 以下劃線開頭的變數和函式

python - 以下劃線開頭的變數和函式

變數名的分類:

以數字字母開頭:正常的公有變數,如:a=1, def a()

以單下劃線開頭:半私有,如:_b = 2, def _bb()

以雙下劃線開頭:私有,如:__c = 3, def __cc()

以雙下劃線開頭雙下劃線結尾:內建屬性名或魔法方法名,如:__name__, __dir__

公有

任何人都可以使用

半私有

1. 類外

類外的半私有物件、私有物件,功能一致,均是在本模組中可以正常使用,但是不能被直接匯入並呼叫

如果一定要在模組外使用,那麼需要匯入本模組,然後使用(模組名.變數名)進行呼叫

2. 類中

類中的半私有物件,僅僅是概念上的私有,預設不要在類外進行呼叫

實際在類外,均可以使用(例項名.變數名/類名.變數名)進行呼叫

私有

1. 類外

同半私有一樣

2. 類中

類中的私有物件,在類外均不能直接呼叫,可以理解為真私有

但是python沒有完全私有的物件,此種物件可以通過矯直在類外進行呼叫的(在私有屬性名、私有方法名前新增(_類名))

魔法方法

這是python自己實現的屬性和方法,一般不允許以這種方式自定義屬性或方法

半私有舉例:

在d2.py中呼叫d1.py中的半私有函式

d1.py

def _init():
    global _global_dict
    _global_dict = {}


def set_value(key, value):
    _global_dict[key] 
= value def get_value(key): return _global_dict[key]

d2.py

import d1  # 匯入d1模組

d1._init()  # 使用模組名.函式名進行呼叫


d1.set_value('name1', 'zhangsan')
print(d1.get_value('name1'))

d2.py(以下會報錯)

from d1 import *

_init()  # 會提示錯誤:Unresolved reference '_init'

d2.py(以下不報錯,這是為啥子呢?)

from d1 import _init

_init()  
# 不報錯