Python找不到类属性

2024-09-26 18:09:03 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么Factory.rdyq对继承的类不可见?你知道吗

你知道吗棒.py你知道吗

import Queue
import threading



class Factory:
    name = ""
    rdyQ = Queue.Queue()
    dispQ = Queue.Queue()

    def __init__(self):
        self.worker_count = 1
        self.worker_thread = None

    def worker(self): pass

    def initialize(self):
        for i in range(self.worker_count):
            t = threading.Thread(target=self.worker)
            t.daemon = True
            t.start()
            self.worker_thread = t




    @staticmethod
    def joinQ():
        Factory.rdyQ.join()
        Factory.dispQ.join()
        return

    @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):
        while True:
            try:
                item = Factory.rdyq.get(timeout=1)
                print "setup: %s" % item
                Factory.rdyq.task_done()

                Factory.dispQ.put(item)
            except Queue.Empty, msg:
                continue

class DispatchFactory(Factory):
    name = "dispatch"

    def worker(self):
        while True:
            try:
                item = Factory.dispQ.get(timeout=1)
                print "dispQ: %s" % item
                Factory.dispQ.task_done()

            except Queue.Empty, msg:
                continue

class CompleteFactory(Factory):
    name = "complete"

    def worker(self):
        for i in range(10):
            Factory.rdyq.put(i)

你知道吗foo.py公司你知道吗

import bar as df

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

setup.initialize()
dispatch.initialize()
complete.initialize()

df.Factory.joinQ()

setup.worker_thread.join()
dispatch.worker_thread.join()
complete.worker_thread.join()

python foo.py

  File "/u/bar.py", line 73, in worker
    Factory.rdyq.put(i)
AttributeError: class Factory has no attribute 'rdyq'

Tags: nameselfreturnqueuefactorydefsetupthread
3条回答

Python变量和属性区分大小写,因此“rdyq”与“rdyq”不同。你知道吗

你用大写字母q来命名,也许这能解决问题?你知道吗

你知道吗工厂.rdyQ.put(一)

我建议使用\u下划线\u作为\u变量,以避免这种情况可能导致的问题。你知道吗

对于joinQ,应该使用classmethod而不是staticmethod。你知道吗

你也有一个rdyq(棒.py最后一行)而不是预期的rdyQ,Python区分大小写。你知道吗

你知道吗棒.py你知道吗

import Queue
import threading



class Factory:
    name = ""
    rdyQ = Queue.Queue()
    dispQ = Queue.Queue()

    def __init__(self):
        self.worker_count = 1
        self.worker_thread = None

    def worker(self): pass

    def initialize(self):
        for i in range(self.worker_count):
            t = threading.Thread(target=self.worker)
            t.daemon = True
            t.start()
            self.worker_thread = t




    @classmethod
    def joinQ(cls):
        cls.rdyQ.join()
        cls.dispQ.join()
        return

    @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):
        while True:
            try:
                item = Factory.rdyq.get(timeout=1)
                print "setup: %s" % item
                Factory.rdyq.task_done()

                Factory.dispQ.put(item)
            except Queue.Empty, msg:
                continue

class DispatchFactory(Factory):
    name = "dispatch"

    def worker(self):
        while True:
            try:
                item = Factory.dispQ.get(timeout=1)
                print "dispQ: %s" % item
                Factory.dispQ.task_done()

            except Queue.Empty, msg:
                continue

class CompleteFactory(Factory):
    name = "complete"

    def worker(self):
        for i in range(10):
            Factory.rdyQ.put(i)

相关问题 更多 >

    热门问题