Ik heb een klas MyThread. Daarin heb ik een voorbeeld van een methode. Ik probeer het vanuit dezelfde objectcontext uit te voeren. Kijk eens naar de code:
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()
Ziet er heel eenvoudig uit, niet? Maar als ik het uitvoer krijg ik deze foutmelding
AttributeError: 'myThread' object has no attribute 'sample'
Nu heb ik die methode, precies daar. Zo wat is er mis? Help alstublieft
Bewerken: dit is de 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'
Ik noem het zo
arThreads = []
maxThreads = 2;
for i in range( maxThreads ):
redisOpsObj = redisOps()
arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )
Sorry, ik kan geen redisOps-klassecode plaatsen. Maar ik kan je verzekeren dat het prima werkt
Antwoord 1, autoriteit 100%
Uw inspringing is misplaatst en u heeft een combinatie van tabs en spaties. Voer het script uit met python -tt
om te verifiëren.
Antwoord 2, autoriteit 19%
Als je python 3+ gebruikt, kan dit ook gebeuren als je privévariabelen gebruikt die beginnen met een dubbel onderstrepingsteken, bijvoorbeeld self.__yourvariable. Iets om rekening mee te houden voor sommigen van jullie die dit probleem kunnen tegenkomen.
Antwoord 3, autoriteit 13%
Dit soort bugs komen vaak voor bij multithreading van Python. Wat er gebeurt, is dat, bij het afbreken van de interpreter, de relevante module (myThread
in dit geval) een soort del myThread
doorloopt.
De aanroep self.sample()
is ongeveer gelijk aan myThread.__dict__["sample"](self)
.
Maar als we bezig zijn met het afbreken van de interpreter, dan heeft zijn eigen woordenboek met bekende typen misschien al myThread
verwijderd, en nu is het in feite een NoneType
– en heeft geen ‘sample’-kenmerk.
Antwoord 4, autoriteit 8%
Dit kan ook gebeuren als je slotsin de klas gebruikt en dit nieuwe kenmerk nog niet aan slots hebt toegevoegd.
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'
Antwoord 5, autoriteit 2%
Ik kreeg deze fout voor een scenario met meerdere threads (met name bij het omgaan met ZMQ). Het bleek dat de socket nog steeds op de ene thread was aangesloten, terwijl een andere thread al gegevens begon te verzenden. De gebeurtenissen die plaatsvonden als gevolg van een andere thread probeerden toegang te krijgen tot variabelen die nog niet waren gemaakt. Als uw scenario multi-threading omvat en als de dingen werken als u een beetje vertraging toevoegt, heeft u mogelijk een soortgelijk probleem.
Antwoord 6
Python beschermt die leden door de naam intern te wijzigen om de klassenaam op te nemen.
U hebt toegang tot attributen als object._className__attrName.
Antwoord 7
Ik ben dezelfde fout ook tegengekomen. Ik weet zeker dat mijn inspringing geen probleem had. Alleen het opnieuw opstarten van de python-verkoop loste het probleem op.
Antwoord 8
Dezelfde fout deed zich voor toen ik een andere variabele had met de naam mythread. Die variabele heeft dit overschreven en daarom kreeg ik een foutmelding
Antwoord 9
Je hebt geen toegang buiten de privévelden van een klas. privévelden beginnen met __ .
bijvoorbeeld –
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 is een privémethode.