模組名稱空間


在Python中,模組實際的作用之一是作為名稱空間,你所建立的變數,最大有效範圍就是模組範圍,而你所定義的函式名稱、類別名稱,實際上也是以模組作為名稱空間。例如:
  • mod.py
x = 10

def some():
print(x)

class Other:
def __init__(self, arg):
self.arg = arg
def show(self):
print(self.arg)

在這個模組中定義了x變數、some函式與Other類別,你可以在另一個模組中這麼使用它:
import mod

print(mod.x) # 10

mod.some() # 10

other = mod.Other(20)
other.show() # 20

實際上,Python中一個可作為名稱空間的物件,都具有__dict__特性(參考 特性名稱空間 ),模組也不例外。例如,若要存取上例中mod模組的x變數、some函式或Other類別,亦可如下操作:
import mod

print(mod.__dict__['x']) # 10

mod.__dict__['some']() # 10

other = mod.__dict__['Other'](20)
other.show() # 20

你可以使用from import語句,於目前模組中建立與被匯入模組相同的變數名稱。例如:
from mod import *

print(x) # 10

some() # 10

other = Other(20)
other.show() # 20

使用from import語句時,若最後是*結尾,則會將被匯入模組中所有變數,在當前模組中都建立相同的名稱。如果你有些變數,並不想被from import *建立同名變數,則可以用底線作為開頭。例如:
  • mod.py
x = 10

def some():
print(x)

class Other:
def __init__(self, arg):
self.arg = arg
def show(self):
print(self.arg)

_y = 10

上例中,mod模組有個_y變數,它不會被from import *用來建立同名變數。例如:
from mod import *

print(x) # 10
some() # 10
other = Other(20)
other.show() # 20

print(_y) # NameError: name '_y' is not defined

不過這個避免被建立同名變數的方式,僅適用於from import *,其它的import形式就不起作用了。例如:
from mod import _y
print(_y) # 10

相對的,你可以在模組中建立一個__all__變數,參考至串列實例,內含想要被其它模組from import *的變數名單,如果有這麼一個__all__變數,則只有名單中的變數,才可以被其它模組from import *。例如:
__all__ = ['x', 'some']

x = 10

def some():
print(x)

class Other:
def __init__(self, arg):
self.arg = arg
def show(self):
print(self.arg)

上例中,僅開放x變數與some函式被其它模組from import *。所以:
from mod import *

print(x) # 10

some() # 10

other = Other(20) # NameError: name 'Other' is not defined