Python|self.を付けないで…globals()でクラスの中から外の変数を参照したい!

Pythonの変数スコープをモジュール全域にする方法です。クラスの中から外の変数を参照できればself.で扱わずに済むのに…という処理を書きたいときがあります。

例えば、オブジェクトをクラスの中から参照したいときに効果的です。オブジェクトの変数をglobals()に入れれば、グローバルのスコープを実現できます。
Pythonの変数をグローバルスコープにする説明を示す画像

変数をグローバル化する

オブジェクトに対する処理をクラス分けしていくときに、そのオブジェクトをクラス変数やインスタンス変数にしたくないときがあります。

クラスの中からでも参照できるようにするには、globals()関数で変数スコープを広げてしまうのが簡便な方法です。

例えば、ファイルオブジェクト(file)をグローバル変数にするにはglobals()['file'] = fileとします。


def main():
    with open('example.txt', 'w') as file:
        globals()['file'] = file
        HeadWriter()()

class HeadWriter(object):
    def __call__(self):
        file.write('head')

オブジェクトを複数のクラスで扱う場合に効果的

変数にしたオブジェクトを、モジュール全域で扱うことができれば便利です。複数のクラスがある場合は、それぞれに受け渡す手間を無くせます。

オブジェクトのスコープをグローバルにすることで、コードの可読性が良くなる場合があります。