Pythonに挑戦(6)その(3)

Pyhonに挑戦(6)その(2)からの続き

(5) 名前空間
pythonでは、モジュール名、変数名、クラス名、関数名、メソッド名といったものを、辞書式に管理して、変数名の混乱が起きないようにしています。
クラス
1の中で、nameという変数を使ったとします。別のクラス2の中でnameという変数を使っても、混同は起きません。クラス1nameはクラス1の中でのみ有効で、クラス2nameはクラス2の中でのみ有効で、両者は別のものとして管理されています。このとき、nameという変数名の有効範囲をスコープと言います。クラス1nameのスコープはクラス1であり、クラス2nameのスコープはクラス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, “に変更されました。“)
という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()
とすると、まず、import test3 as xで、test3.pyxという名前で使用可能になります。test3.pyの中にmes1xwidthがあるのですが、呼び出し側で単に、mes1xwidthに書き込んでもmes1xwidthも呼び出し側のローカルな変数であって、test3mes1xwidthには影響を与えません。test3.pymes1xwidthにアクセスためには、“x.”を付けて、x.mes1x.xwidthとする必要があります。また、test3.pyyheightにアクセスするつもりで、呼び出し側で単に、yheightとすると、呼び出し側にはyheightは存在しないので、NameError例外が発生します。yheightを書き換えようとして、呼び出し側でtest3.pyの関数glfunc()を呼び出そうとして、単にglfunc(123, 456)とすると、ローカルの名前空間にはglfuncが存在しないので、NameError例外が発生します。例外が発生するとプログラムが止まってしまうので、上記では例外処理をつけて止まらないようにしています。test3.pyglfunc()を呼び出すためには、
x.glfunc(123, 456)
とする必要があります。これで、test3.pyxwidthyheightを書き換えることができます。リストも同様で、test3.pyuserというリストにアクセスするためには、
x.user.append(“Mary”)
のようにします。test3.pyのクラスglclass()のインスタンスgl1を作る場合も、
gl1 = x.glclass()
とします。ですが、インスタンスgl1を作ってしまえば、test3.pyの中にあるglclassのメソッドreg()disp()を使う場合は、test3.pyを意識せずに、
gl1.reg(“apple”)
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’]
と表示されます。

Pythonに挑戦(6)その(4)に続く

【広告】 ここから広告です。ご覧の皆さまのご支援ご理解を賜りたく、よろしくお願いいたします。
【広告】 広告はここまでです。
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする