2012-03-10 1 views
2

это правильный способ doing.i новичок PythonNameError: название «я» не определен - при попытке опубликовать значения различных очередей

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

Исправьте отступы, это не читается иначе. – bereal

+1

Этот код даже не запускался бы так! – ThiefMaster

+2

Я исправил ваш отступ только так, как я мог предположить, что вы имели в виду. –

ответ

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

+1. Также хорошо понимать, что 'self', в то время как редакторы могут покрасить его как ключевое слово, не имеет никакого специального значения * для компилятора Python. Это просто условное имя для первого аргумента метода экземпляра. –

+0

@JohanLundberg: ненавистники будут ненавидеть ... (+1) –

+0

@RikPoggi, "'\\ _ (-) _ /'" –

0

Пожалуйста, убедитесь, что функция send_queue является частью основного класса. self похож на указатель 5 на C++ и должен быть связан с классом. send_queue функция должна быть отступ вместе с main классом

+0

Неверный оператор: и должен быть связан с классом. Он должен быть: и должен быть связан с экземпляром класса. –

2

Вы не можете использовать «себя» для переменного класса/function..You может использовать «себя» для экземпляра класса ...

Например:

class A(): 
    x=3 

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

Ax - переменная класса. B's self.x - это переменная экземпляра .. !!

Также для вызова функции класса ... лучше всего сделать экземпляр (объект) этого класса и вызвать функцию с этим объектом .. !!

Как:

x = main() 
x.send_queue() 

И для кода, который будет работать над созданием «экземпляра», поместите этот код в __init__(): функции

Смежные вопросы