这是正确的做法。我是一个新手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'未定义???
答案 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
类