Pyhonに挑戦(6)その(2)からの続き
(5) 名前空間
pythonでは、モジュール名、変数名、クラス名、関数名、メソッド名といったものを、辞書式に管理して、変数名の混乱が起きないようにしています。
クラス1の中で、nameという変数を使ったとします。別のクラス2の中でnameという変数を使っても、混同は起きません。クラス1のnameはクラス1の中でのみ有効で、クラス2のnameはクラス2の中でのみ有効で、両者は別のものとして管理されています。このとき、nameという変数名の有効範囲をスコープと言います。クラス1のnameのスコープはクラス1であり、クラス2のnameのスコープはクラス2です。
クラス1の中で、nameという変数を使ったとします。別のクラス2の中でnameという変数を使っても、混同は起きません。クラス1のnameはクラス1の中でのみ有効で、クラス2のnameはクラス2の中でのみ有効で、両者は別のものとして管理されています。このとき、nameという変数名の有効範囲をスコープと言います。クラス1のnameのスコープはクラス1であり、クラス2のnameのスコープはクラス2です。
# global
xwidth = 800
yheight = 1360
mes1 = “Hello! Everybody.”
user = [“Bob”, “Tom”, “Julie”, “Ann”]
class glclass:
def __init__(self):
self.name = []
self.count = 0
def reg(self, s1):
self.name.append(s1)
self.count += 1
return self.count
def disp(self):
print(“メンバー・リスト:“, self.name)
def glfunc(x1, y1):
global xwidth, yheight
xwidth = x1
yheight = y1
print(“xwidthは“, xwidth, “に、yheightは“, yheight, “に変更されました。“)
xwidth = 800
yheight = 1360
mes1 = “Hello! Everybody.”
user = [“Bob”, “Tom”, “Julie”, “Ann”]
class glclass:
def __init__(self):
self.name = []
self.count = 0
def reg(self, s1):
self.name.append(s1)
self.count += 1
return self.count
def disp(self):
print(“メンバー・リスト:“, self.name)
def glfunc(x1, y1):
global xwidth, yheight
xwidth = x1
yheight = y1
print(“xwidthは“, xwidth, “に、yheightは“, yheight, “に変更されました。“)
というtest3.pyというpythonファイルを用意します。ここで、呼び出し側(test3.pyとは別ファイル)で、
import test3 as x
mes1 = “local”
print(“mes1:“, mes1, “x.mes1:“, x.mes1)
xwidth = 300
print(“xwidth:“, xwidth, “x.xwidth:“, x.xwidth, “x.yheight:“, x.yheight)
try:
print(“yheight:“, yheight)
except NameError:
print(“NameError発生!yheightは定義されていません。“)
try:
glfunc(123, 456)
except NameError:
print(“NameError発生!glfuncは定義されていません。“)
x.glfunc(123, 456)
print(“x.xwidth:“, x.xwidth, “x.yheight:“, x.yheight)
try:
print(“user:“, user)
except:
print(“NameError発生!userは定義されていません。“)
print(“x.user:“, x.user)
x.user.append(“Mary”)
print(“Maryが追加されました。x.user:“, x.user)
gl1 = x.glclass()
print(gl1.reg(“apple”), “番目の登録“)
print(gl1.reg(“orange”), “番目の登録“)
gl1.disp()
mes1 = “local”
print(“mes1:“, mes1, “x.mes1:“, x.mes1)
xwidth = 300
print(“xwidth:“, xwidth, “x.xwidth:“, x.xwidth, “x.yheight:“, x.yheight)
try:
print(“yheight:“, yheight)
except NameError:
print(“NameError発生!yheightは定義されていません。“)
try:
glfunc(123, 456)
except NameError:
print(“NameError発生!glfuncは定義されていません。“)
x.glfunc(123, 456)
print(“x.xwidth:“, x.xwidth, “x.yheight:“, x.yheight)
try:
print(“user:“, user)
except:
print(“NameError発生!userは定義されていません。“)
print(“x.user:“, x.user)
x.user.append(“Mary”)
print(“Maryが追加されました。x.user:“, x.user)
gl1 = x.glclass()
print(gl1.reg(“apple”), “番目の登録“)
print(gl1.reg(“orange”), “番目の登録“)
gl1.disp()
とすると、まず、import test3 as xで、test3.pyがxという名前で使用可能になります。test3.pyの中にmes1,xwidthがあるのですが、呼び出し側で単に、mes1,xwidthに書き込んでもmes1もxwidthも呼び出し側のローカルな変数であって、test3のmes1,xwidthには影響を与えません。test3.pyのmes1,xwidthにアクセスためには、“x.”を付けて、x.mes1,x.xwidthとする必要があります。また、test3.pyのyheightにアクセスするつもりで、呼び出し側で単に、yheightとすると、呼び出し側にはyheightは存在しないので、NameError例外が発生します。yheightを書き換えようとして、呼び出し側でtest3.pyの関数glfunc()を呼び出そうとして、単にglfunc(123, 456)とすると、ローカルの名前空間にはglfuncが存在しないので、NameError例外が発生します。例外が発生するとプログラムが止まってしまうので、上記では例外処理をつけて止まらないようにしています。test3.pyのglfunc()を呼び出すためには、
x.glfunc(123, 456)
とする必要があります。これで、test3.pyのxwidthとyheightを書き換えることができます。リストも同様で、test3.pyのuserというリストにアクセスするためには、
x.user.append(“Mary”)
のようにします。test3.pyのクラスglclass()のインスタンスgl1を作る場合も、
gl1 = x.glclass()
とします。ですが、インスタンスgl1を作ってしまえば、test3.pyの中にあるglclassのメソッドreg(),disp()を使う場合は、test3.pyを意識せずに、
gl1.reg(“apple”)
gl1.disp()
gl1.disp()
として、glclassを明示することなく、glclassのメソッドを使うことができます。以上を実行すると、画面に、
mes1: local x.mes1: Hello! Everybody.
xwidth: 300 x.xwidth: 800 x.yheight: 1360
NameError発生!yheightは定義されていません。
NameError発生!glfuncは定義されていません。
xwidthは 123 に、yheightは 456 に変更されました。
x.xwidth: 123 x.yheight: 456
NameError発生!userは定義されていません。
x.user: [‘Bob’, ‘Tom’, ‘Julie’, ‘Ann’]
Maryが追加されました。x.user: [‘Bob’, ‘Tom’, ‘Julie’, ‘Ann’, ‘Mary’]
1 番目の登録
2 番目の登録
メンバー・リスト: [‘apple’, ‘orange’]
xwidth: 300 x.xwidth: 800 x.yheight: 1360
NameError発生!yheightは定義されていません。
NameError発生!glfuncは定義されていません。
xwidthは 123 に、yheightは 456 に変更されました。
x.xwidth: 123 x.yheight: 456
NameError発生!userは定義されていません。
x.user: [‘Bob’, ‘Tom’, ‘Julie’, ‘Ann’]
Maryが追加されました。x.user: [‘Bob’, ‘Tom’, ‘Julie’, ‘Ann’, ‘Mary’]
1 番目の登録
2 番目の登録
メンバー・リスト: [‘apple’, ‘orange’]
と表示されます。