2016-07-27 19 views
0

私は現在、Python 2.7でコードを書いています。これには、2つのクラスメソッドと他の通常のメソッドがあるオブジェクトの作成が含まれます。この特定の組み合わせのメソッドを使用する必要があります。なぜなら、私が書いているコードの文脈がより大きくなっているからです。この質問には関係しませんので、深くは触れません。@classmethod変数が "定義されていない"のはなぜですか?

私の__init__関数内で、私はプール(マルチプロセッシングオブジェクト)を作成しています。その作成の中で、私はセットアップ機能を呼び出します。このセットアップ関数は@classメソッドです。 cls.variablename構文を使用して、このセットアップ関数でいくつかの変数を定義します。私が言及したように、私は自分のinit関数内で(プール作成の中で)このセットアップ関数を呼び出します。したがって、これらの変数は私が理解しているところに基づいて作成されるはずです。

私のコードの後半に、他のいくつかの関数が呼び出され、先ほどの@classmethodと同じオブジェクト内で別の@classメソッドを呼び出すようになりました。この@classメソッドでは、最初の@classmethodで作成したcls.variablesにアクセスしようとしています。しかし、Pythonは私のオブジェクトには属性 "cls.variable"がないことを伝えています(ここでは一般的な名前を使用していますが、私の実際の名前は自分のコードに固有です)。

いつも...私はおそらくかなり混乱していることを認識しています。ここでは同じ考えを説明するために、いくつかの(非常に)一般コードの例です:

class General(object): 
    def __init__(self, A): 
     # this is correct syntax based on the resources I'm using, 
     # so the format of argument isn't the issue, in case anyone 
     # initially thinks that's the issue 
     self.pool = Pool(processes = 4, initializer=self._setup, initargs= (A,) 

    @classmethod 
    def _setup(cls, A): 
     cls.A = A 

    #leaving out other functions here that are NOT class methods, just regular methods 

    @classmethod 
    def get_results(cls): 
     print cls.A 

私はprint cls.A lineの同等に得るとき、私は取得していますエラーはこれです:使用方法を表示する

AttributeError: type object 'General' has no attribute 'A' 

編集 私は私のコードでこれを呼んでいる方法のような次のとおりです:だから

G = General(5) 
G.get_results() 

、私は、私はプールを作成したオブジェクト(のインスタンスを作成しています。このコードのsetup関数を呼び出します)、get_resultsを呼び出します。

私は間違っていますか?

+1

「General._setup」を呼び出したことがありますか? – chepner

+3

特に、General.get_resultsというプロセスで 'General._setup'を呼びましたか? – user2357112

+0

@chepner私は、init関数でPoolオブジェクトを作成しているときに呼び出すことにします。 – Ria

答えて

1

General.Aがメインプロセスで定義されません。その理由は、multiprocessing.PoolのみサブプロセスでGeneral._setupを実行していることです。これは、でなく、メインプロセス(Poolと呼ばれる)で呼び出されることを意味します。

あなたは、それぞれがGeneral.Aが定義されていて、メインプロセスではない4つのプロセスになります。あなたは実際にそのようなプールを初期化しません(this answerの質問How to use initializer to set up my multiprocess pool?を参照)

あなたはObject PoolをPythonにネイティブに入れたいと思っています。 StackOverflowにPython Implementation of the Object Pool Design Patternという質問がありますが、オンラインで検索するだけで束を見つけることができます。

+0

@Ria一部の機能が不足している可能性があります。そのウェブサイトは、スタンドアロンのレポが利用可能であると言っています。[こちら](https://github.com/aholmberg/driver-multiprocessing) – Artyer

+0

@Ria:ええ、それは間違っていました。そのリンクの例は、メインプロセスからプール初期化子で設定されたものに決してアクセスしようとしません。なぜなら、その初期化はメインプロセスでは決して起こらないからです。 – user2357112

+0

@Artyerご協力ありがとうございます。自分のコード例では、もっと混乱させてしまうと思っていたので、たくさんの機能を使いませんでした。実際のコードにすべてがあると思います。しかし、私は何かを逃した可能性が非常にです。再度、感謝します! – Ria

関連する問題