Python - __all__ 變量


import *

  • 當我們向文件導入某個模塊時,導入的是該模塊中那些名稱不以下划線(單下划線 _ 或者雙下划線 __ )開頭的變量、函數和類
  • 因此,如果不想模塊文件中的某個對象被引入到其它文件中使用,可以在其名稱前添加下划線
  • 下面就來講下 import * 的栗子

 

demo.py

def say():
    print("人生苦短,我學Python!")
def disPython(): print("小菠蘿教程:https://www.cnblogs.com/poloyy/")

  

test.py

from demo import *

say()
disPython()

 

執行結果

人生苦短,我學Python!
小菠蘿教程:https://www.cnblogs.com/poloyy/

 

如果對象不想被引入呢

如果 demo.py 模塊中的 disPython() 函數不想讓其它文件引入,則只需將其名稱改為 _disPython() 或者 __disPython() 

再次執行 test.py,輸出結果

人生苦短,我學Python!
Traceback (most recent call last):
  File "C:/Users/polo/Desktop/2.py", line 4, in <module>
    disPython()
NameError: name 'disPython' is not defined

test.py 文件中無法使用未引入的 disPython() 函數

 

Python 模塊 __all__ 變量

  • 模塊提供的 __all__ 變量,該變量的值是一個列表,存儲的是當前模塊中一些對象成員(變量、函數或者類)的名稱(字符串格式)
  • 通過在模塊文件中設置 __all__ 變量,當其它文件以 from 模塊名 import * 的形式導入該模塊時,該文件中只能使用 __all__ 列表中指定的對象成員,未指定的成員是無法導入的

 

demo.py

def say():
    print("人生苦短,我學Python!")

def disPython():
    print("小菠蘿教程:https://www.cnblogs.com/poloyy/") 

__all__ = ["say"]

__all__ 變量包含 say()的函數名,包含 disPython() 函數的名稱

 

test.py

from demo import *

say()
disPython()

 

運行 test.py

人生苦短,我學Python!
Traceback (most recent call last):
  File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
    disPython()
NameError: name 'disPython' is not defined
  • 對於 test.py 來說,demo.py 模塊中的 disPython() 函數是未引入,這樣調用是非法的
  • 重點:__all__ 變量僅限於在其它文件中以 from 模塊名 import * 的方式引入

 

使用以下 2 種方式引入模塊,__all__ 變量是無效的

方式一

 import 模塊名 的形式導入模塊,通過該方式導入模塊后,總可以通過模塊名前綴(如果為模塊指定了別名,則可以使用模快的別名作為前綴)來調用模塊內的所有成員(除了以下划線開頭命名的成員)

 

demo.py 

def say():
    print("人生苦短,我學Python!")

def disPython():
    print("小菠蘿教程:https://www.cnblogs.com/poloyy/") 

__all__ = ["say"]

 

test.py

import demo

demo.say()
demo.disPython()

 

運行 test.py

人生苦短,我學Python!
小菠蘿教程:https://www.cnblogs.com/poloyy/

雖然 demo.py 模塊中設置有  __all__ 變量,但是當以 import demo 的方式引入后,__all__ 變量將不起作用

 

方式二

 from 模塊名 import 對象成員 的形式直接導入指定成員,使用此方式導入的模塊,__all__ 變量即便設置,也不起作用

 

demo.py 

仍然是上面的 demo 代碼

 

test.py

from demo import say
from demo import disPython

say()
disPython()

 

運行 test.py

人生苦短,我學Python!
小菠蘿教程:https://www.cnblogs.com/poloyy/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM