前回のが問題なく使えるか確認した。
成果物
前回まで
ということで、以下の方法に鞍替え。
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で手軽に実装したい。