やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

sys.modules[key]にclassインスタンスを代入して複数回それをimportしてもインスタンス初期化されないことを確認した

前回のが問題なく使えるか確認した。

成果物

GitHubPython.Const.201709140800

前回まで

ということで、以下の方法に鞍替え。

sys.modules__setattr__で再代入禁止を実装したクラスのインスタンスを代入するという荒業。

今回

上記を使うとき、以下の疑問が生じたので試した。結果、問題なかった。

2回importしたら1回目の属性設定が消えるのでは?

2回importしたら2回sys.modules[__name__]=_const()が実行されてしまうのではないか?

_const()によりインスタンスは新しいものが生成され、=式で代入され、これまでの_constインスタンスとそれに代入していた属性は消えてしまうのでは?

const.py

print('***** import start const.py ****')
...
import sys
sys.modules[__name__]=_const()
print('***** import end const.py ****')

0.py

import const
...
import const
  • ***** import start const.py ****は1回しか表示されなかった

0.py

import const
const.test = "Test"

import const
const.test = "Test"
  • 2回目のimport文のあとで、その前に作った属性に代入すると例外が発生した

問題ない。思い通りに動作している。

同一mouduleは1回しかimportされない

上記の結果から「同一moduleは1回しかimportされない」ということなのか?

import文の回数だけ実行されるのでは?

以下の検証でも1回のみだった。

  • main.py
  • const.py
  • sub.py

main.py

import sub
import const
print(const, type(const))
import const

sub.py

import const

const.py

print('CONST!')
  • 同一module内で2回、同一moduleをimportする
  • 異なるmoduleをまたいで同一moduleをimportする

実行しても、CONST!の表示は1回だけだった。

$ python main.py
CONST!

「同一mouduleは1回しかimportされない」ということだろう。

所感

使えるかも知れない。これを複数の任意classで手軽に実装したい。