Tengo una clase MyThread. En eso tengo una muestra de método. Estoy tratando de ejecutarlo desde el mismo contexto de objeto. Por favor, mire el código:
class myThread (threading.Thread):
def __init__(self, threadID, name, counter, redisOpsObj):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
self.redisOpsObj = redisOpsObj
def stop(self):
self.kill_received = True
def sample(self):
print "Hello"
def run(self):
time.sleep(0.1)
print "\n Starting " + self.name
self.sample()
Parece muy simple, ¿no? Pero cuando lo ejecuto, aparece este error.
AttributeError: 'myThread' object has no attribute 'sample'
Ahora tengo ese método, ahí mismo. ¿Así que qué hay de malo? Por favor ayuda
Editar: este es el stacktrace
Starting Thread-0
Starting Thread-1
Exception in thread Thread-0:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'
Lo estoy llamando así
arThreads = []
maxThreads = 2;
for i in range( maxThreads ):
redisOpsObj = redisOps()
arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )
Lo siento, no puedo publicar el código de clase de redisOps. Pero puedo asegurarte que funciona bien
Respuestas:
Su sangría es errónea y ha mezclado tabulaciones y espacios. Ejecute el script con
python -tt
para verificar.fuente
python -tt script.py
-tt
? No lo he encontrado en los documentos-tt
bandera no está presente en Python 3, estaba en Python 2.Este tipo de errores son comunes cuando Python multi-threading. Lo que sucede es que, al desmontar el intérprete, el módulo correspondiente (
myThread
en este caso) pasa por una especie dedel myThread
.La llamada
self.sample()
es aproximadamente equivalente amyThread.__dict__["sample"](self)
. Pero si estamos durante la secuencia de eliminación del intérprete, es posible que su propio diccionario de tipos conocidos ya se hayamyThread
eliminado, y ahora es básicamente unNoneType
atributo de "muestra" y no tiene.fuente
Si está usando Python 3+, esto también puede ocurrir si está usando variables privadas que comienzan con doble subrayado, por ejemplo, self .__ yourvariable. Solo algo para tomar nota para algunos de ustedes que pueden encontrarse con este problema.
fuente
Esto también puede ocurrir si usa espacios en la clase y aún no ha agregado este nuevo atributo en los espacios.
class xyz(object): """ class description """ __slots__ = ['abc', 'ijk'] def __init__(self): self.abc = 1 self.ijk = 2 self.pqr = 6 # This will throw error 'AttributeError: <name_of_class_object> object has no attribute 'pqr'
fuente
Recibí este error para el escenario de subprocesos múltiples (específicamente cuando se trata de ZMQ). Resultó que el socket todavía estaba conectado en un hilo mientras que otro hilo ya comenzaba a enviar datos. Los eventos que ocurrieron debido a otro hilo intentaron acceder a variables que aún no se crearon. Si su escenario implica subprocesos múltiples y si las cosas funcionan si agrega un poco de retraso, es posible que tenga un problema similar.
fuente
Python protege a esos miembros cambiando internamente el nombre para incluir el nombre de la clase. Puede acceder a atributos como object._className__attrName.
fuente
También he encontrado el mismo error. Estoy seguro de que mi sangría no tuvo ningún problema. Solo reiniciar la venta de Python resolvió el problema.
fuente
El mismo error ocurrió cuando tuve otra variable llamada mythread. Esa variable sobrescribió esto y es por eso que tengo un error
fuente
No puede acceder a campos privados externos de una clase. los campos privados comienzan con __. por ejemplo -
class car: def __init__(self): self.__updatesoftware() def drive(self): print("driving") def __updatesoftware(self): print("updating software:") obj = car() obj.drive() obj.__updatesoftware() ## here it will throw an error because
__updatesoftware es un método privado.
fuente