2016-06-23 13 views
2

setup.inQcomplete.inQとは異なりますか?Python:工場属性

私はあるキューに何かを置くと、他のキューには表示されませんでしたか?

import Queue 


class Factory: 
    name = "" 
    inQ = Queue.Queue() 
    outQ = Queue.Queue() 

    def worker(self): pass 

    @staticmethod 
    def getFactory(factory_name): 
     if factory_name == "setup": 
      return SetupFactory() 
     elif factory_name == "dispatch": 
      return DispatchFactory() 
     elif factory_name == "complete": 
      return CompleteFactory() 
     else: 
      return None 

class SetupFactory(Factory): 
    name = "setup" 

    def worker(self): 
     #extend 

class DispatchFactory(Factory): 
    name = "dispatch" 
    def worker(self): 
     #extend 

class CompleteFactory(Factory): 
    name = "complete" 
    def worker(self): 
     #extend 

setup = Factory.getFactory("setup") 
complete = Factory.getFactory("complete") 

答えて

2

これはテストに十分に簡単です:私たちはq属性が実際にサブクラス間で共有されていることを

>>> import Queue 
>>> class A(object): 
... q = Queue.Queue() 
... 
>>> class B(A): 
... pass 
... 
>>> a = A() 
>>> b = B() 
>>> b.q is a.q 
True 

参照してください。 (b.qに物を入れることはa.qにものを入れることと全く同じです)。

A.qはクラスの属性なので、Aを作成すると作成されます。 Bが作成されると、Bはプロパティとメソッドを継承し、Aから継承されるため、Pythonは新しいオブジェクトを作成しません。

一般に、クラスのインスタンス間で共有されないプロパティを持つ場合は、クラスの初期化関数(__init__)に入れると、インスタンスを作成するときにpythonによって魔法のように呼び出されます。クラス:

class Factory(object): 
    name = "" 

    def __init__(self): 
     self.inQ = Queue.Queue() 
     self.outQ = Queue.Queue() 
+0

ああありがとうございます。 Queue.Queue()を各クラスに移動する必要があります。すべてのキューに表示するアイテムがない場合 – ealeon

+0

@ealeon - おそらくそのコードを '__init__'に移動したいと思います。 – mgilson

+0

ohhh yeah illそれを試みなさい! – ealeon