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

时间:2012-03-10 10:44:26

标签: python queue

这是正确的做法。我是一个新手python

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

当我运行这个时,我得到NameError:名称'self'未定义???

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:2)

您不能将“ self ”用于Class变量/函数。您可以将“ self ”用于Class的实例...

例如:

class A():
    x=3

class B():
    def __init__(self):
        self.x=3

A.x是一个类变量。 B的self.x是一个实例变量.. !!

同样用于调用Class的函数。最佳实践是创建该类的实例(Object)并使用该Object调用该函数。!!

喜欢:

x = main()
x.send_queue()

要在“实例”创建时运行代码,请将该代码放入  __init__():功能

答案 2 :(得分:0)

请确保send_queue函数是主类的一部分。 self与C ++中的this指针类似,需要与类关联。 send_queue函数应与main

一起缩进