12

コードを再編成しているため、新しい名前空間を作成しています。モジュールの「静的」クラス (各メソッドに @staticmethod を含むクラス) を変更しています。これが進むべき道ですよね?

問題は、これらのモジュール間でリソースを共有する方法に疑問があることです。

データベースへのすべての接続を行うモジュールがあり、もちろんすべてのクラス/メソッドがDBカーソルを格納する変数を共有していたとしましょう(私はSQLiteを使用しています)。現在、異なるモジュールでは、カーソルも共有する必要があります。

依存関係のグラフ表示

だから、私の考え:

  • 各モジュールでグローバル変数を宣言します。しかし、グローバルは悪であり、子供を食べ、私たちの仕事を奪います。ですから、この方法でよいかどうかはわかりません。

    '''Sub Module 1'''
    
    global database_cursor
    
  • 元の database_cursor を使用して「親」database_module をインポートし、次のように使用します。

    '''Sub Module 1'''
    
    db_cursor = database_module.database_cursor
    

この場合、この 2 番目は問題ないように見えますが、多くの場合、再帰的なインポートにつながると思います。これは避けるべきだと思います。

4

1 に答える 1

22

あなたの2番目の方法は行く方法です。Python インポートは本質的にシングルトンです。モジュールが複数回インポートされた場合、最初にのみ実行されます。後続のインポートでは、モジュール オブジェクト インスタンスがグローバルからフェッチされます。詳細はこちら

共有.py:

class Shared:
    def __init__(self):
        print("Init shared")

    def do_stuff(self, from_mod):
        print("Do stuff from {0}. I am instance {1}".format(from_mod, self))

shared = Shared()

foo.py

import shared

shared.shared.do_stuff("foo")

bar.py

import foo
import shared

shared.shared.do_stuff("bar")

bar.py を実行すると、次のようになります。

>>> Init shared
>>> Do stuff from foo. I am instance <shared.Shared instance at 0x10046df38>
>>> Do stuff from bar. I am instance <shared.Shared instance at 0x10046df38>

したがって、あなたの場合database_module、どこからでも参照でき、一度だけ初期化されるため、接続を効果的に共有できます。

于 2012-11-30T10:28:41.897 に答える