作用域
學(xué)習(xí)過(guò) Java 的同學(xué)都知道,Java 的類里面可以給方法和屬性定義公共的( public )或者是私有的 ( private ),這樣做主要是為了我們希望有些函數(shù)和屬性能給別人使用或者只能內(nèi)部使用。 通過(guò)學(xué)習(xí) Python 中的模塊,其實(shí)和 Java 中的類相似,那么我們?cè)趺磳?shí)現(xiàn)在一個(gè)模塊中,有的函數(shù)和變量給別人使用,有的函數(shù)和變量?jī)H僅在模塊內(nèi)部使用呢?
在 Python 中,是通過(guò) _ 前綴來(lái)實(shí)現(xiàn)的。正常的函數(shù)和變量名是公開(kāi)的(public),可以被直接引用,比如:abc,ni12,PI等;類似__xxx__這樣的變量是特殊變量,可以被直接引用,但是有特殊用途,比如上面的 __name__ 就是特殊變量,還有 __author__ 也是特殊變量,用來(lái)標(biāo)明作者。注意,我們自己的變量一般不要用這種變量名;類似 _xxx 和 __xxx 這樣的函數(shù)或變量就是非公開(kāi)的(private),不應(yīng)該被直接引用,比如 _abc ,__abc 等;
注意,這里是說(shuō)不應(yīng)該,而不是不能。因?yàn)?Python 種并沒(méi)有一種方法可以完全限制訪問(wèn) private 函數(shù)或變量,但是,從編程習(xí)慣上不應(yīng)該引用 private 函數(shù)或變量。
比如:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- def _diamond_vip(lv): print('尊敬的鉆石會(huì)員用戶,您好') vip_name = 'DiamondVIP' + str(lv) return vip_name def _gold_vip(lv): print('尊敬的黃金會(huì)員用戶,您好') vip_name = 'GoldVIP' + str(lv) return vip_name def vip_lv_name(lv): if lv == 1: print(_gold_vip(lv)) elif lv == 2: print(_diamond_vip(lv)) vip_lv_name(2)
輸出的結(jié)果:
尊敬的鉆石會(huì)員用戶,您好 DiamondVIP2
在這個(gè)模塊中,我們公開(kāi) vip_lv_name 方法函數(shù),而其他內(nèi)部的邏輯分別在 _diamond_vip 和 _gold_vip private 函數(shù)中實(shí)現(xiàn),因?yàn)槭莾?nèi)部實(shí)現(xiàn)邏輯,調(diào)用者根本不需要關(guān)心這個(gè)函數(shù)方法,它只需關(guān)心調(diào)用 vip_lv_name 的方法函數(shù),所以用 private 是非常有用的代碼封裝和抽象的方法
一般情況下,外部不需要引用的函數(shù)全部定義成 private,只有外部需要引用的函數(shù)才定義為 public。