モジュール間でデータを共有するより洗練された方法は、クラス インスタンスまたはシングルトン設計パターンを使用することです。
- クラスとインスタンス:
共有したいデータが関連している場合は、それらをクラスでラップできます。クラスは、データと機能をまとめてバンドルする方法です。
簡単な例を次に示します。
# file: shared_data.py
class SharedData:
def __init__(self):
self.data = None
次に、別のモジュールで次のようにします。
# file: module1.py
from shared_data import SharedData
# create an instance of SharedData
shared_data_instance = SharedData()
shared_data_instance.data = "Hello, World!"
そして 3 番目のモジュールでは次のようになります。
# file: module2.py
from shared_data import SharedData
# create another instance of SharedData
shared_data_instance = SharedData()
print(shared_data_instance.data) # This will print: None
の新しいインスタンスを作成するたびにSharedData
独自のdata
属性があるため、これは期待どおりに機能しません。
- シングルトン パターン:
シングルトン パターンは、クラスのインスタンス化を単一のインスタンスに制限する設計パターンです。これは、システム全体のアクションを調整するために 1 つのオブジェクトだけが必要な場合に便利です。シングルトン クラスの基本的な例を次に示します。
# file: singleton.py
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
これで、Singleton
クラスを複数回インスタンス化すると、常に同じインスタンスが取得されます。
# file: module1.py
from singleton import Singleton
singleton_instance = Singleton()
singleton_instance.data = "Hello, World!"
そして 3 番目のモジュールでは次のようになります。
# file: module2.py
from singleton import Singleton
singleton_instance = Singleton()
print(singleton_instance.data) # This will print: "Hello, World!"
Singleton
クラスは常に同じインスタンスを返すため、これは期待どおりに機能します。
ただし、グローバル変数とシングルトンはプログラムを理解しにくくし、微妙なバグを引き起こす可能性があるため、一般に悪い設計とみなされていることに注意してください。通常は、たとえより多くの入力が必要になる場合でも、データを必要とする関数やメソッドにデータを明示的に渡すことをお勧めします。