NameError:未定义名称"self" - 尝试将值发布到不同的队列时

Rag*_*gav 2 python queue

这是正确的做法.我是一个新手蟒蛇

class main(threading.Thread):
    queueLock = threading.Lock()
    EppQueue = Queue.Queue(1)
    CrQueue = Queue.Queue(1)
    EPP = threading.Thread(name='EPP', target=EPP, args=(0,EppQueue,))
    cr = threading.Thread(name='cr', target=CR, args=(0,CrQueue,))
    EPP.setDaemon(True)
    EPP.start()
    Cr.start()
    self.send_queue("EppQueue","sss")
    self.send_queue("CrQueue","ssds")

    def send_queue(self,queuename,qvalue,b=None):
        if b is None:
            b = self.queuename
        self.queueLock.acquire()
        self.b.put(qvalue)
        self.queueLock.release()
Run Code Online (Sandbox Code Playgroud)

当我运行这个我得到NameError:名称'自己'没有定义???

Joh*_*erg 7

变量self(类方法的第一个参数 - 可以使用任何名称)意味着引用类实例(也称为对象).你在没有定义self的地方使用self,就在没有特定对象的类中.

当执行代码queueLock = threading.lock()...等时,您不在类对象(实例)中,而是在类的上下文中,因此您的锁对于类的所有对象都是相同的.

关于send_queue,它通过类定义并为所有对象所知,因此您无需使用self.它来访问它.

如果你想在实例创建时执行一些代码,请将其放入__init__.

class main(threading.Thread):
  def __init__(self):
    self.queueLock = threading.Lock() 
    .. some code ... 
    send_queue("EppQueue","sss")
    send_queue("CrQueue","ssds")
Run Code Online (Sandbox Code Playgroud)

  • +1.知道`self`也很好,而编辑可能会将它作为关键字着色,对Python编译器没有任何特殊意义*.它只是实例方法的第一个参数的传统名称. (3认同)