NameError: имя 'self' не определено - при попытке отправить значения в разные очереди - PullRequest
2 голосов
/ 10 марта 2012

это правильный способ. Я новичок на питоне

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 ]

7 голосов
/ 10 марта 2012

Переменная 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")
2 голосов
/ 10 марта 2012

Вы не можете использовать " self " для переменной / функции Class .. Вы можете использовать " self " для экземпляра Class ...

Например:

class A():
    x=3

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

A.x - переменная класса. Self.x B является переменной экземпляра .. !!

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

Как:

x = main()
x.send_queue()

А чтобы код запускался при создании экземпляра, поместите этот код в __init__(): функция

0 голосов
/ 10 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...