Waarom krijg ik AttributeError: Object heeft geen kenmerk

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 -ttom 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 (myThreadin dit geval) een soort del myThreaddoorloopt.

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 myThreadverwijderd, 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.

Other episodes