【问题标题】:Python: Factory attributesPython:工厂属性
【发布时间】:2016-06-23 16:58:43
【问题描述】:

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")

【问题讨论】:

    标签: python factory


    【解决方案1】:

    这很容易测试:

    >>> 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 被创建时,Python 不会创建一个新的,因为B 只是从A 继承属性和方法。

    一般来说,如果你想拥有一个不在类的实例之间共享的属性,你可以把它放在类的初始化函数 (__init__) 中,当你创建一个实例时它会被 python 神奇地调用类:

    class Factory(object):
        name = ""
    
        def __init__(self):
            self.inQ = Queue.Queue()
            self.outQ = Queue.Queue()
    

    【讨论】:

    • 啊,好的,谢谢。所以如果我没有一个项目出现在所有队列中,我将不得不将 Queue.Queue() 移动到每个类
    • @ealeon -- 我想你可能想将该代码移至__init__
    • 哦,是的,我试试看!
    猜你喜欢
    • 2020-07-18
    • 2019-03-27
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多