Ich habe eine Klasse MyThread. Darin habe ich ein Methodenbeispiel. Ich versuche, es aus demselben Objektkontext heraus auszuführen. Bitte schauen Sie sich den Code an:
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()
Sieht sehr einfach aus, nicht wahr? Aber wenn ich es starte, bekomme ich diesen Fehler
AttributeError: 'myThread' object has no attribute 'sample'
Jetzt habe ich genau dort diese Methode. Also, was ist falsch? Bitte helfen Sie
Bearbeiten: Dies ist die Stapelverfolgung
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'
Ich nenne es so
arThreads = []
maxThreads = 2;
for i in range( maxThreads ):
redisOpsObj = redisOps()
arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )
Leider kann ich keinen redisOps-Klassencode veröffentlichen. Aber ich kann Ihnen versichern, dass es gut funktioniert
Antworten:
Ihre Einrückung ist vermasselt und Sie haben Tabulatoren und Leerzeichen gemischt. Führen Sie das Skript
python -tt
zur Überprüfung mit aus.quelle
python -tt script.py
-tt
? Ich habe es nicht in den Dokumenten gefunden-tt
Flag ist in Python 3 nicht vorhanden, es war in Python 2.Diese Art von Fehlern tritt häufig beim Python-Multithreading auf. Was passiert, ist, dass das relevante Modul (
myThread
in diesem Fall) beim Abreißen des Interpreters eine Art durchläuftdel myThread
.Der Anruf
self.sample()
entspricht in etwamyThread.__dict__["sample"](self)
. Wenn wir uns jedoch während der Abreißsequenz des Interpreters befinden, wurde möglicherweise bereits ein eigenes Wörterbuch bekannter TypenmyThread
gelöscht, und jetzt ist es im Grunde einNoneType
- und hat kein 'Beispiel'-Attribut.quelle
Wenn Sie Python 3+ verwenden, kann dies auch auftreten, wenn Sie private Variablen verwenden, die mit einem doppelten Unterstrich beginnen, z. B. self .__ yourvariable. Nur etwas, das Sie für einige von Ihnen beachten sollten, die möglicherweise auf dieses Problem stoßen.
quelle
Dies kann auch auftreten, wenn Sie Slots in der Klasse verwenden und dieses neue Attribut noch nicht in Slots hinzugefügt haben.
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'
quelle
Ich habe diesen Fehler für ein Multithreading-Szenario erhalten (speziell beim Umgang mit ZMQ). Es stellte sich heraus, dass der Socket noch mit einem Thread verbunden war, während ein anderer Thread bereits mit dem Senden von Daten begann. Die Ereignisse, die aufgrund eines anderen Threads aufgetreten sind, haben versucht, auf Variablen zuzugreifen, die noch nicht erstellt wurden. Wenn Ihr Szenario Multithreading umfasst und die Dinge funktionieren, wenn Sie etwas Verzögerung hinzufügen, liegt möglicherweise ein ähnliches Problem vor.
quelle
Python schützt diese Mitglieder, indem der Name intern so geändert wird, dass er den Klassennamen enthält. Sie können auf Attribute wie object._className__attrName zugreifen.
quelle
Ich habe den gleichen Fehler auch festgestellt. Ich bin sicher, dass meine Einrückung kein Problem hatte. Nur ein Neustart des Python-Verkaufs löste das Problem.
quelle
Der gleiche Fehler trat auf, als ich eine andere Variable namens mythread hatte. Diese Variable hat dies überschrieben und deshalb habe ich einen Fehler bekommen
quelle
Sie können nicht auf private Felder einer Klasse zugreifen. Private Felder beginnen mit __. zum Beispiel -
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 ist eine private Methode.
quelle