2016-06-23 2 views
2

setup.inQcomplete.inQ과 다른가요?파이썬 : 공장 속성

하나의 큐에 뭔가를 넣으면 다른 큐에 나타나지 않을 것입니다. 맞습니까?

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

이 시험에 충분히 쉽게 :

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

우리는 q 속성이 참으로 서브 클래스에서 공유되는 것을 알 수있다. (b.q에 물건을 넣는 것은 a.q에 물건을 넣는 것과 완전히 똑같습니다).

A.q은 클래스의 속성이므로 A이 생성되면 생성됩니다. B이 생성되면 파이썬은 새로운 것을 생성하지 않습니다. BA에서 프로퍼티와 메소드를 상속합니다.

일반적으로 말해서 클래스의 인스턴스간에 공유되지 않는 속성을 원한다면 클래스의 초기화 함수 (__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 illh 그것을 시도하십시오! – ealeon