作用域
學(xué)過Java 的同學(xué)都知道,Java 的類別裡面可以給方法和屬性定義公共的( public )或者是私有的( private ),這樣做主要是為了我們希望有些函數(shù)和屬性能給別人使用或者只能內(nèi)部使用。透過學(xué)習(xí) Python 中的模組,其實和 Java 中的類別相似,那麼我們怎麼實現(xiàn)在一個模組中,有的函數(shù)和變數(shù)給別人使用,有的函數(shù)和變數(shù)只是在模組內(nèi)部使用呢?
在 Python 中,是透過 _ 前綴來實現(xiàn)的。正常的函數(shù)和變數(shù)名稱是公開的(public),可以被直接引用,例如:abc,ni12,PI等;類似__xxx__這樣的變數(shù)是特殊變量,可以直接引用,但是有特殊用途,例如上面的__name__ 是特殊變量,還有__author__ 也是特殊變量,用來標(biāo)示作者。注意,我們自己的變數(shù)一般不要用這種變數(shù)名;類似_xxx 和__xxx 這樣的函數(shù)或變數(shù)就是非公開的(private),不應(yīng)該直接引用,例如_abc ,__abc 等;
注意,這裡是說不應(yīng)該,而不是不能。因為 Python 種並沒有一種方法可以完全限制存取 private 函數(shù)或變量,但是,從程式設(shè)計習(xí)慣上不應(yīng)該引用 private 函數(shù)或變數(shù)。
例如:
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- def _diamond_vip(lv): print('尊敬的鉆石會員用戶,您好') vip_name = 'DiamondVIP' + str(lv) return vip_name def _gold_vip(lv): print('尊敬的黃金會員用戶,您好') 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é)果:
尊敬的鉆石會員用戶,您好 DiamondVIP2
在這個模組中,我們公開vip_lv_name 方法函數(shù),而其他內(nèi)部的邏輯分別在_diamond_vip 和_gold_vip private函數(shù)中實現(xiàn),因為是內(nèi)部實作邏輯,呼叫者根本不需要關(guān)心這個函數(shù)方法,它只需關(guān)心呼叫vip_lv_name 的方法函數(shù),所以用private 是非常有用的程式碼封裝和抽象的方法
#一般情況下,外部不需要引用的函數(shù)全部定義成private,只有外部需要引用的函數(shù)才定義為public。